异常,堆栈展开,封装堆内存,exit()
Exceptions, stack unwinding, encapsulated heap memory, exit()
当抛出异常时,抛出异常的块将从堆栈中退出:
int main ()
{
try
{
Object x; // doesn't throw
Object y; // throws
cout << "wonderful";
}
catch (...)
{
cout << "fail";
}
}
当Object
在堆上的构造内存上进行分配并在销毁时正确地将其释放时,则不应存在内存泄漏,因为堆栈展开调用x
的析构函数(不是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();
}
在exit
将控制权交还给操作系统之前,x
的析构函数是否调用了?
更深入:
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
}
在exit
将控制权交还给操作系统之前,x
的构造函数是否调用了?如果是,则exit
"展开"包括main()
在内的所有周围堆栈,对吗?
好的,多亏了polkadotcadaver:永远不要使用exit()
,在main()
之前传播异常,并在那里做一个简单的return
-在操作系统控制之前,所有堆栈Objects
都将被自己的析构函数释放。
相关文章:
- 将字符串存储在c++中的稳定内存中
- C++ 指针的内存地址和指向数组的内存地址如何相同?
- Win32编译器选项和内存分配
- 当vector是tje全局变量时,c++中vector的内存管理
- 带内存和隔离功能的SQLite
- 是否可以通过C++扩展强制多个python进程共享同一内存
- 迭代时从向量和内存中删除对象
- 在C++中打印指向不同基元数据类型的指针的内存地址
- 这个指针和内存代码打印是什么?我不知道是打印垃圾还是如何打印我需要的值
- 多个文件的内存分配错误"在抛出 'std :: bad_alloc' what (): std :: bad_alloc 的实例后终止调用" [C++]
- 为什么示例代码访问IUnknown中已删除的内存
- 如何在C++类内存结构中创建"spacer"?
- 从构造函数抛出异常时如何克服内存泄漏
- malloc() 可能出现内存泄漏
- 如何理解将半精度指针转换为无符号长指针和相关的内存对齐
- 在调用FreeLibrary后,释放动态链接到具有相同版本的CRT堆的DLL的内存
- 如何针对特定情况调试和修复此双自由内存损坏问题
- 类型总是使用其大小存储在内存中吗
- 有没有一种方法可以测量c++程序的运行时内存使用情况
- 异常,堆栈展开,封装堆内存,exit()