0

当抛出异常时,抛出异常的块将从堆栈中展开:

int main ()
{
    try
    {
        Object x; // doesn't throw
        Object y; // throws
        cout << "wonderful";
    }
    catch (...)
    {
        cout << "fail";
    }
}

Object在堆上分配构造内存并在销毁时正确释放它时,应该没有内存泄漏,因为堆栈展开调用析构函数x(不是 of y,而是Object保证,当构造函数失败时,没有内存泄漏)。还好,不是吗?

让我们深入探讨:

int main ()
{
    Object x; // doesn't throw
    double *d = new double[256*256*256]; // doesn't throw
    Object y; // throws
    cout << "wonderful";
    delete[] d;
}

因为受过良好的教育,我想自己清理垃圾,而不是让操作系统来做。我知道,每个现代操作系统都会自行删除程序的堆内存,该程序会意外终止(或预期,但没有明确的释放)。所以在大写的情况下,d我的操作系统的释放会在操作系统做之前x正确地释放它的内存(因为堆栈展开和析构函数调用),对吧?

那个怎么样:

#include <cstdlib>

int main ()
{
    Object x; // doesn't throw
    try { Object y; } // throws
    catch (...) {  cout << "fail"; exit(EXIT_FAILURE); }
    cout << "working and working...";
    cin.get();
}

之前x调用的析构函数是否将控制权交还给操作系统? exit

更深入:

void Object::be_stupid ()
{
    Object a; // doesn't throw
    try { Object b; }// throws
    catch (...) { exit(EXIT_FAILURE); }
}

void main ()
{
    Object x; // doesn't throw
    try { x.be_stupid(); } // exits program
}

之前x调用的构造函数是否将控制权交还给操作系统?如果是,那么“展开”所有周围的堆栈,包括,对吗? exitexitmain()

4

1 回答 1

0

好的,感谢 polkadotcadaver:永远不要使用exit(),传播异常,直到main()并在那里做一个简单的事情——在操作系统控制之前return,所有堆栈Objects都将由它们自己的析构函数释放。

于 2013-12-13T22:56:50.797 回答