如果在C++中,具有自动存储的对象没有通过调用exit来销毁,那么在离开程序后,这些对象会发生什么
If in C++ objects with automatic storage are not destroyed by calling exit, what happens with this objects after leaving the program?
在这个网站(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()调用具有自动存储的对象后会导致内存泄漏(因为它不会被破坏)?或者,它可能只在使用运算符new从堆中分配内存时发生?
也许我把这个问题表述得不太清楚,但我想知道具有自动存储的对象在任何情况下是否被破坏,即使程序在块结束前没有到达,并被exit()调用中断。
正常的内存分配不会泄漏,因为当进程退出时,其所有内存页都会被清除。然而,在其析构函数中清理独立于进程的外部资源(如文件)的对象可能会泄漏它们,例如:
class TempFile {
public:
TempFile() { /* create a file on disk */ }
~TempFile() { /* delete the file from disk */ }
}
void foo() {
TempFile tf;
exit(0);
}
这通常是内存泄漏;不过,现代操作系统会清除它。
我建议阅读下面的公认答案,因为我们需要知道你所说的"内存泄漏"是什么意思:
Valgrind 检测到仍然可到达的泄漏
根据C++98§18.3/8
当exit
时,只销毁静态对象,然后执行atexit
处理程序,刷新和关闭打开的流,并删除由tmpfile
创建的文件本地自动对象不会被销毁。
http://en.cppreference.com/w/cpp/utility/program/exit
堆栈未展开:具有自动存储的变量的析构函数持续时间不称为
#include <cstdlib>
#include <iostream>
struct C
{
C( const std::string &name ) :
m_name( name ) { }
~C()
{
std::cout<< m_name << " destructor" <<std::endl;
}
std::string m_name;
};
static C c1( "Static C" );
void f()
{
C c( "Local C" );
exit(1);
}
int main()
{
f();
}
告诉您的只是没有调用析构函数。并不是说内存泄漏。
- 我有一个对象,它将在整个程序的持续时间内实例化,但一个类成员不会,我应该动态分配它吗?
- 内存清理程序报告全局对象构造中未初始化值的使用
- 程序如何'remember'临时对象?
- 什么是"undetectable means",它们如何更改 C/C++ 程序的对象?
- 是否可以使用非常量指针调用非常量函数,以及当两个unique_ptrs指向同一个对象时程序的行为方式?
- 将FFMpeg AVFrame对象从C++应用程序流式传输到Python的最佳方法?
- 将 C# 对象(包含静态对象成员)作为参数传递给 C++/CLI 程序
- C++,在对象内分配多个数据时,堆栈分配是否更有效? 在下面的程序中,类A_Heap的效率会更低吗?
- 通过 COM 对象连接 x64 应用程序时出现问题
- 修改多线程应用程序中的对象
- 无法在需要对象展开修复程序的函数中使用__try
- 在C++面向对象程序中,谁负责删除传递给构造函数的对象
- 将文件从 iOS 应用程序加载到 C++ 对象中/<iostream>iOS 上的问题
- 运行程序时找不到共享对象库,但在编译过程中链接了它
- 在C++中,系统如何将这些对象中的每一个与执行程序的窗口相关联?
- OpenGL和面向对象程序结构
- C++面向对象程序和PHP面向对象程序之间的区别
- C++面向对象程序中的获取和设置方法
- 我编写了一个小的面向对象程序,我不知道为什么它不能编译
- C++面向对象程序复制了继承模式