关于c ++中的析构函数

Jay*_*man 0 c++ destructor

现在的问题是如何正确地删除名称中的一个析构函数?

class A{
private:
    char *name;
public:
    A(char *n) : name(n) {}
    ~A(){
        //???
    }
}

int main(){
    A *a = new A("name");
    delete a;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

And*_*owl 7

鉴于您没有更改构造函数,那么正确的方法是不删除任何内容.字符串的所有权属于客户端,因为您没有创建副本.

但是,正确的重写方法是让构造函数分配字符串的副本,new[]然后让析构函数释放它delete[].

真正正确的方法是让std::string做整个事情给你,而不是写一个明确的析构函数都:

#include <string>

class A{
private:
   std::string name;
public:
    A(std::string n) : name(std::move(n)) {}
};
Run Code Online (Sandbox Code Playgroud)

顺便说一句,这使您不必担心规则三,这意味着您不必费心编写复制构造函数,移动构造函数,复制赋值运算符,移动赋值运算符,析构函数等等.

  • 我希望其中一个提到`std :: string`是真正正确的方法. (2认同)