当抛出异常时,抛出异常的块将从堆栈中展开:
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
调用的构造函数是否将控制权交还给操作系统?如果是,那么“展开”所有周围的堆栈,包括,对吗? exit
exit
main()