如果在带有自动存储的C++对象中没有通过调用exit来销毁,那么离开程序后这些对象会发生什么?

Dag*_*gua 4 c++ memory memory-leaks

在这个网站(cplusplus.com)上,我读到了通过调用exit()不会破坏带有自动存储的对象.这是否意味着内存泄漏?我知道当你到达自动变量范围的末尾时,它们将被销毁,但是在这种情况下是否意味着我们没有达到范围的结束而只是离开程序?


我很好奇在这个例子中我会在论坛中发现内存会发生什么:

C++代码

#include <cstdlib>
#include <iostream>

struct C
{
    ~C()
    {
        std::cout<<"X"<<std::endl;
    }
};

void f()
{
    C c;
    exit(1);
}

int main()
{
    f();
}
Run Code Online (Sandbox Code Playgroud)

这里没有输出"X"所以没有调用析构函数.我们可以说它是内存泄漏吗?


编辑:

谢谢你的回复.但我想澄清其他一些事情.假设操作系统在程序完成后不会释放内存,这是否意味着在exit()之后调用具有自动存储的对象会导致内存泄漏(因为它不会被破坏)?或者它可能只发生在使用例如operator new的堆分配内存时?

也许我提出的问题不太清楚,但我想知道在任何情况下是否销毁了自动存储的对象,即使程序在块结束之前没有到达并且被exit()调用中断.

Whe*_*zil 7

正常的内存分配不能泄漏,因为当进程退出所有内存页面时都会被清除.但是,在析构函数中清除与进程无关的外部资源(如文件)的对象可能会泄漏它们,例如:

class TempFile {
public:
   TempFile() { /* create a file on disk */ }
   ~TempFile() { /* delete the file from disk */ }
}
void foo() {
   TempFile tf;
   exit(0);
}
Run Code Online (Sandbox Code Playgroud)