这被认为是内存泄漏吗?

nsi*_*akr 5 c++ memory-leaks memory-management throw

一般规则,只有在免费存储区中分配的对象才会导致内存泄漏.但是在堆栈中创建的对象却没有.

这是我的疑问,

int main()
    {
      myclass x;

      ...

      throw;

      ...
    }
Run Code Online (Sandbox Code Playgroud)

如果不处理throw,则调用terminate(),然后调用abort()并使应用程序崩溃.此时,堆栈中的对象不会被破坏(不会调用析构函数).

我的理解是"当应用程序终止时(通过中止或正常退出),它释放了为应用程序分配的所有内存".因此,这不能被视为内存泄漏.

我对么?

Dio*_*lis 5

在托管环境(例如典型的Unix/Windows/Mac OS X,甚至DOS,机器)中,当应用程序终止其占用的所有内存时,操作系统会自动回收它们.因此,担心这种内存泄漏是没有意义的.

在某些情况下,在应用程序终止之前,您可能希望释放所分配的所有动态内存,以便通过检漏器(如valgrind)检测潜在的内存泄漏.但是,即使在这种情况下,您描述的示例也不会被视为内存泄漏.

通常,无法调用析构函数与导致内存泄漏不同.内存泄漏源于堆上分配的内存(使用new或malloc或容器分配器).当堆栈展开时,堆栈上分配的内存会自动回收.但是,如果一个对象持有一些其他资源(比如文件或窗口句柄),则无法调用其析构函数将调用资源泄漏,这也可能是一个问题.同样,现代操作系统将在应用程序终止时回收其资源.