根据:http://www.cplusplus.com/doc/tutorial/classes/
析构函数实现了构造函数的相反功能.当一个对象被销毁时会自动调用它,因为它的存在范围已经完成(例如,如果它被定义为函数中的本地对象并且函数结束),或者因为它是一个动态分配的对象并且它被释放使用运算符删除.
示例代码:
class Something
{
public:
Something() {cout << "construction called" << endl; }
~Something() { cout << "destruction called" << endl; }
};
void foo(){
Something *ob = new Something();
}
int _tmain(int argc, _TCHAR* argv[])
{
foo();
}
Run Code Online (Sandbox Code Playgroud)
这是真的,但你在动态内存中分配对象,这意味着在你调用之前它不会被破坏delete.
因为它是一个动态分配的对象,它是使用operator delete释放的.
你永远不会叫删除.Ergo内存泄漏和未调用的析构函数:
void foo(){
Something *ob = new Something();
delete ob;
}
Run Code Online (Sandbox Code Playgroud)
这个,或者只是在自动内存中分配对象:
void foo(){
Something ob;
}
Run Code Online (Sandbox Code Playgroud)
或将内存管理委派给智能指针.
在销毁对象之前调用析构函数.由于您使用了对象new,因此必须手动显式地销毁它并通过调用delete指向对象的指针来释放它占用的内存.
如果您已在自动存储中创建了对象,则为àla
Something ob;
Run Code Online (Sandbox Code Playgroud)
该对象将被自动销毁,并且当foo返回时对象超出范围时将调用析构函数.