0

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

2 回答 2

8

没错,但是您在动态内存中分配对象,这意味着它不会被破坏,直到您调用delete.

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

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

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

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

void foo(){
    Something ob;
}

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

于 2012-09-25T17:06:24.220 回答
6

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

如果您在自动存储中创建了对象,à la

Something ob;

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

于 2012-09-25T17:06:35.667 回答