在此站点上 (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 从堆分配内存时发生?
也许我提出的问题不太清楚,但我想知道在任何情况下具有自动存储的对象是否被销毁,即使程序在 block 结束之前未到达并被 exit() 调用中断。
最佳答案
正常的内存分配不会泄漏,因为当进程退出时,它的所有内存页都会被清理。但是,在其析构函数中清理与进程无关的外部资源(如文件)的对象可能泄漏它们,例如:
class TempFile {
public:
TempFile() { /* create a file on disk */ }
~TempFile() { /* delete the file from disk */ }
}
void foo() {
TempFile tf;
exit(0);
}
关于c++ - 如果在 C++ 中自动存储的对象没有被调用 exit 销毁,那么离开程序后这个对象会发生什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37603399/