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

在这个站点(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();
}

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

编辑:

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

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

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

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

转载注明原文:如果在具有自动存储的C对象中没有通过调用exit销毁,那么在离开程序后该对象会发生什么? - 代码日志