异想天开

What's the true meaning of light, Could you tell me why

C++合成析构函数

日期:2015-06-04 15:47:24
  
最后更新日期:2015-06-26 10:31:24
《C++ primer》提到编译器会生成合成析构函数,不论用户是否自定义了类的析构函数。当对象退出作用域时,先调用用户自定义的类析构函数(若存在),然后调用编译生成的合成析构函数,合成析构函数,逐个调用类的non-static成员的析构函数。
何时编写显示析构函数?
当类需要析构函数,则它也需要赋值操作符和复制构造函数,这个规则常称为三法则(rule of three)。
也就是合成析构函数,会帮我们析构成员对象的内存,而成员对象指针所指向的内存,则需要用户自己编写析构函数来释放。若自己编写的析构函数,释放了成员对象的内存,导致了两次释放内存,程序会core。如下面例子:
[code lang="cpp"]
#include<iostream>
#include<string>
using namespace std;

class A{
public:
A(){}
A(string &name):m_name(name){}
A(const char *name):m_name(name){}
~A()
{
m_name.~string();
}
private:
string m_name;
};

int main()
{
{
A a("hello world");
}
cout<<"success!"<<endl;
return 0;
}
[/code]