nsi*_*akr 5 c++ memory-leaks memory-management throw
一般规则,只有在免费存储区中分配的对象才会导致内存泄漏.但是在堆栈中创建的对象却没有.
这是我的疑问,
int main()
{
myclass x;
...
throw;
...
}
Run Code Online (Sandbox Code Playgroud)
如果不处理throw,则调用terminate(),然后调用abort()并使应用程序崩溃.此时,堆栈中的对象不会被破坏(不会调用析构函数).
我的理解是"当应用程序终止时(通过中止或正常退出),它释放了为应用程序分配的所有内存".因此,这不能被视为内存泄漏.
我对么?
在托管环境(例如典型的Unix/Windows/Mac OS X,甚至DOS,机器)中,当应用程序终止其占用的所有内存时,操作系统会自动回收它们.因此,担心这种内存泄漏是没有意义的.
在某些情况下,在应用程序终止之前,您可能希望释放所分配的所有动态内存,以便通过检漏器(如valgrind)检测潜在的内存泄漏.但是,即使在这种情况下,您描述的示例也不会被视为内存泄漏.
通常,无法调用析构函数与导致内存泄漏不同.内存泄漏源于堆上分配的内存(使用new或malloc或容器分配器).当堆栈展开时,堆栈上分配的内存会自动回收.但是,如果一个对象持有一些其他资源(比如文件或窗口句柄),则无法调用其析构函数将调用资源泄漏,这也可能是一个问题.同样,现代操作系统将在应用程序终止时回收其资源.
| 归档时间: |
|
| 查看次数: |
417 次 |
| 最近记录: |