根据:http://www.cplusplus.com/doc/tutorial/classes/
析构函数实现了构造函数的相反功能。当一个对象被销毁时,它会被自动调用,因为它的存在范围已经完成(例如,如果它被定义为函数中的本地对象并且函数结束),或者因为它是一个动态分配的对象并且它被释放使用operator delete。
示例代码:
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();
}
答案 0 :(得分:6)
这是真的,但你在动态记忆中分配对象,这意味着在你致电delete
之前不会破坏它。
因为它是动态分配的对象,所以使用operator delete释放它。
你永远不会打电话给删除。 Ergo内存泄漏和未调用的析构函数:
void foo(){
Something *ob = new Something();
delete ob;
}
或者这个,或者只是在自动记忆:
中分配对象void foo(){
Something ob;
}
或将内存管理委派给智能指针。
答案 1 :(得分:6)
在销毁对象之前调用析构函数。由于您使用new
分配了对象,因此必须手动显式销毁它并通过在指向对象的指针上调用delete
来释放它占用的内存。
如果您已在自动存储中创建了对象,则
Something ob;
当foo
返回时,对象将被自动销毁并且当对象超出范围时将调用析构函数。