我应该删除C++类的字符串成员吗?

Bla*_*de3 17 c++ string

如果我有以下声明:

#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();
};
Run Code Online (Sandbox Code Playgroud)

析构函数中的代码应该是什么?我应该"删除" std::string字段吗?

Liz*_*bin 25

您的析构函数只需要销毁您为其分配资源的成员.所以不,你不"删除"字符串.

删除使用new分配的指针

你的析构函数不必超过

~DEMData()
{
}
Run Code Online (Sandbox Code Playgroud)

  • 实际上你可以把析构函数留下来.编译器会为你做 (10认同)
  • 如果你不提供它,编译器会为你生成. (2认同)

Gre*_*ndt 6

不,std :: string成员会自动分配给堆栈或堆,并自动清理.您不必在析构函数中执行任何特殊操作来处理字符串.


Unc*_*ens 5

您不需要析构函数(也不需要复制构造函数,也不需要重载的赋值运算符)。这就是使用像字符串这样的类为您做事的全部意义,而不是使用 C 风格的字符串和手动内存管理。

编译器会为您生成上述所有内容,并且默认情况下,析构函数仅调用所有成员的析构函数(即使在用户定义的析构函数完成后,也会隐式发生这种情况)。String 的析构函数从那里接管。


Sys*_*min 5

不,你不应该删除std::string对象.当他们的析构函数被调用时,它们将自动释放.