析构函数没有被调用

时间:2012-09-25 17:04:54

标签: c++

根据: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();
    }

2 个答案:

答案 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返回时,对象将被自动销毁并且当对象超出范围时将调用析构函数。