Я должен удалить строковых членов класса C++?

Если у меня есть следующее объявление:

#include <iostream>
#include <string>

class DEMData
{
private:
    int bitFldPos;
    int bytFldPos;
    std::string byteOrder;
    std::string desS;
    std::string engUnit;
    std::string oTag;
    std::string valType;
    int idx;
public:
    DEMData();
    DEMData(const DEMData &d);
    void SetIndex(int idx);
    int GetIndex() const;
    void SetValType(const char* valType);
    const char* GetValType() const;
    void SetOTag(const char* oTag);
    const char* GetOTag() const;
    void SetEngUnit(const char* engUnit);
    const char* GetEngUnit() const;
    void SetDesS(const char* desS);
    const char* GetDesS() const;
    void SetByteOrder(const char* byteOrder);
    const char* GetByteOrder() const;
    void SetBytFldPos(int bytFldPos);
    int GetBytFldPos() const;
    void SetBitFldPos(int bitFldPos);
    int GetBitFldPos() const;
    friend std::ostream &operator<<(std::ostream &stream, DEMData d);
    bool operator==(const DEMData &d) const;
    ~DEMData();
};

чем код должен быть в деструкторе? Если я "удаляю" std::string поля?

17
задан mac 27 December 2011 в 16:57
поделиться

4 ответа

Ваш деструктор должен уничтожить только те члены, для которых вы выделяете ресурсы. так что нет, вы не "удаляете" строки.

Вы удаляете указатели, которые вы выделяете с помощью new

Ваш деструктор не должен быть больше, чем

~DEMData()
{
}
25
ответ дан 30 November 2019 в 11:32
поделиться

Нет, члены std::string автоматически выделяются на стеке или куче для вас и автоматически очищаются. Вам не нужно делать ничего специального в вашем деструкторе для обработки строк.

6
ответ дан 30 November 2019 в 11:32
поделиться

Нет, вам не следует удалять объекты std :: string . они будут автоматически освобождены при вызове их деструктора.

5
ответ дан 30 November 2019 в 11:32
поделиться

Вам не нужен деструктор (ни конструктор копирования, ни перегруженный оператор присваивания). В этом весь смысл использования класса, такого как строка, который делает что-то за вас, вместо того, чтобы использовать строки в стиле C и ручное управление памятью.

Компилятор производит все вышеупомянутое за вас, и по умолчанию деструктор просто вызывает деструкторы всех членов (это происходит неявно даже после завершения определенного пользователем деструктора). Деструктор String берет на себя ответственность оттуда.

3
ответ дан 30 November 2019 в 11:32
поделиться
Другие вопросы по тегам:

Похожие вопросы: