未调用析构函数

Destructor not being called

本文关键字:析构函数 调用      更新时间:2023-10-16

根据: http://www.cplusplus.com/doc/tutorial/classes/

析构函数实现构造函数的相反功能。当对象被销毁时,它会自动调用,要么是因为它的存在范围已经完成(例如,如果它被定义为函数中的本地对象并且函数结束),要么是因为它是一个动态分配的对象,并且使用运算符 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();
    }

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

因为它是动态分配的对象,并且使用运算符 Delete 释放。

你从不调用删除。尔格内存泄漏和未调用析构函数:

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

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

void foo(){
    Something ob;
}

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

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

如果对象是在自动存储中创建的,则

Something ob;
对象

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