【问题标题】:Destructor not being called没有调用析构函数
【发布时间】:2012-09-17 06:07:35
【问题描述】:

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

【问题讨论】:

    标签: c++


    【解决方案1】:

    确实如此,但是您将对象分配在动态内存中,这意味着在您调用delete之前它不会被破坏。

    因为它是一个动态分配的对象,使用操作符delete释放。

    你永远不会调用 delete。因此内存泄漏和未调用的析构函数:

    void foo(){
        Something *ob = new Something();
        delete ob;
    }
    

    要么这样,要么干脆在自动内存中分配对象:

    void foo(){
        Something ob;
    }
    

    或将内存管理委托给智能指针。

    【讨论】:

      【解决方案2】:

      在对象被销毁之前调用析构函数。由于您使用new 分配了对象,因此您必须手动显式销毁它并通过在指向该对象的指针上调用delete 来释放它占用的内存。

      如果您在自动存储中创建了对象,点菜

      Something ob;
      

      foo 返回时,对象将被自动销毁,并在对象超出范围时调用析构函数。

      【讨论】:

        猜你喜欢
        • 2019-10-05
        • 2011-11-23
        • 2015-12-23
        • 1970-01-01
        • 2017-11-18
        • 2011-03-26
        • 1970-01-01
        • 2011-04-16
        • 2018-05-30
        相关资源
        最近更新 更多