现在的问题是如何正确地删除名称中的一个析构函数?
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)
鉴于您没有更改构造函数,那么正确的方法是不删除任何内容.字符串的所有权属于客户端,因为您没有创建副本.
但是,正确的重写方法是让构造函数分配字符串的副本,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)
顺便说一句,这使您不必担心规则三,这意味着您不必费心编写复制构造函数,移动构造函数,复制赋值运算符,移动赋值运算符,析构函数等等.