析构函数没有被调用

cro*_*wso 0 c++

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

Luc*_*ore 6

这是真的,但你在动态内存中分配对象,这意味着在你调用之前它不会被破坏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)

或将内存管理委派给智能指针.


Set*_*gie 6

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

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

Something ob;
Run Code Online (Sandbox Code Playgroud)

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