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

时间:2010-03-02 18:26:13

标签: 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();
};

析构函数中应包含哪些代码?我应该“删除”std::string字段吗?

4 个答案:

答案 0 :(得分:25)

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

您使用 new

删除指定的指针

您的析构函数不必超过

~DEMData()
{
}

答案 1 :(得分:6)

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

答案 2 :(得分:5)

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

答案 3 :(得分:3)

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

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