Подтвердить что ты не робот

Должен ли я удалять члены строки класса С++?

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

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

4b9b3361

Ответ 1

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

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

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

~DEMData()
{
}

Ответ 2

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

Ответ 3

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

Ответ 4

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

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