Ответ 1
Ваш деструктор должен уничтожить только те элементы, для которых вы выделяете ресурсы. так что нет, вы не "удаляете" строки.
Вы удаляете указатели, которые вы выделяете с помощью нового
Ваш деструктор не должен быть больше
~DEMData()
{
}
Если у меня есть следующее объявление:
#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
?
Ваш деструктор должен уничтожить только те элементы, для которых вы выделяете ресурсы. так что нет, вы не "удаляете" строки.
Вы удаляете указатели, которые вы выделяете с помощью нового
Ваш деструктор не должен быть больше
~DEMData()
{
}
Нет, члены std::string выделяются автоматически в стек или кучу для вас и автоматически очищаются. Вам не нужно делать что-либо особенное в своем деструкторе для обработки строк.
Нет, вы не должны удалять объекты std::string
. они будут автоматически освобождены, когда их деструктор будет вызван.
Вам не нужен деструктор (ни конструктор копирования, ни перегруженный оператор присваивания). То, что весь смысл использования класса, такого как строка, которая делает что-то для вас, вместо того, чтобы идти со строками в стиле C и ручным управлением памятью.
Компилятор производит все вышеперечисленное для вас, и по умолчанию деструктор просто вызывает деструкторы всех членов (это происходит неявно даже после того, как пользовательский деструктор завершит). Оттуда берет на себя деструктор строк.