c++ - 如果在 C++ 中自动存储的对象没有被调用 exit 销毁,那么离开程序后这个对象会发生什么?

标签 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();
}

这里没有输出“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/

相关文章:

c++ - 从函数返回 shared_ptr

C++ 从内存中读取 1 位?

c++ - 如果用户输入超过字符数组中设置的字符数怎么办?

c++ - 为什么当我对数组使用增量操作时 for 循环不起作用

c++ - 是否有用于 Visual C++ 的编译器标志来检查调用 printf() 的类型安全性?

regex - Perl 程序在编译正则表达式时内存泄漏

android - 内存泄漏终结器错误

c++ - 是否可以创建没有结构的新类型变量?

c++ - 巨大的内存分配 : stack vs heap

c++ - 如何正确取消初始化 OpenSSL