Должен ли я удалить строковые члены класса C ++? - PullRequest
17 голосов
/ 02 марта 2010

Если у меня есть следующая декларация:

#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?

Ответы [ 4 ]

25 голосов
/ 02 марта 2010

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

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

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

~DEMData()
{
}
6 голосов
/ 02 марта 2010

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

5 голосов
/ 02 марта 2010

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

3 голосов
/ 02 марта 2010

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...