在Exit()时调用基本对象析构函数

Are Basic Object Destructors Called On Exit()?

本文关键字:对象 析构函数 调用 Exit      更新时间:2023-10-16

我意识到这个问题已经出现了几次,但我试图得到上述问题的明确答案,但我不断遇到相互矛盾的信息。我需要知道的是,当我使用exit()时,基本类对象是否被销毁。我知道需要删除动态内存,但我的意思更像是:

#include <iostream>
#include <string>
#include <stdlib.h>
using namespace std;
class employee
{
    public:
        employee ();
        string name;
        ~employee();
};
employee::employee () 
{
    name = "bob";
}
employee::~employee()
{
    cout << "Object destroyed" << endl;
}
int main()
{
    employee emp1;
    exit(1);
    cout << "Hello" << endl;
}

现在,如果我从主程序中删除exit(1),"Object destroyed"answers"Hello"将按预期打印出来。把它留在那里,都没有打印出来。"Hello"的原因很明显,但我的印象是emp1仍然会被销毁,但销毁消息没有显示…

我正在看这个链接,它说静态对象被销毁。上面的对象不是静态的吗?

如果没有,是否有一种方法可以让程序在不占用内存的情况下终止?我的项目围绕用户输入展开,我试图在用户输入单词'exit'时提供退出选项。

if(input_var == "exit")
    {
        cout << "You have chosen to exit the program." << endl;
        exit(1);
    }

是我的意图的一个粗略的例子

根据这个链接,它不会清理对象。注意,如果使用非堆栈内存,它将调用析构函数:

static employee emp1;

第二个注意。任何时候使用cout调试边缘情况、定时关键调试等,都应该在cout之后添加cout.flush(),以确保输出在继续之前被打印出来。我看到很多人使用cout来调试崩溃,输出从来没有打印出来,因为程序在操作系统有机会打印输出之前就终止了。

您的emp1变量在堆栈上分配。exit不销毁基于本地栈的变量

我需要知道的是,如果一个基本类对象被析构,当我使用exit () .

你已经证明了它不是。标记为"exit"的操作系统服务在不考虑代码问题的情况下这样做。

是否有一种方法可以让程序终止而不与之发生冲突记忆?

您已经演示了exit至少是不调用c++析构函数而终止程序的一种方法。退出是语言无关的

a)这意味着内存不会被析构函数修改。

那么内存是被拧坏了吗?

b)退出(和主返回)处理的一部分是该进程的所有内存资源将被操作系统回收。内存不会被'拧',(没有调用析构函数,没有'wipe'或'erase')。

c) exit的一部分是关闭由该进程打开的所有流。(文件、设备、终端等)

如果b)或c)修改内存,则无法判断,因为这些修改不再与封闭进程相关联。

你可以扔。异常将清除未展开的作用域。

//...
int main()
{
  try{
    employee emp1;
    throw 1; //fake; throwing an object is more advisable in real situations
    cout << "Hello" << endl;
  }catch(int){ 
    exit(1); //or better simply `return 1;`
  }
}

输出:

Object destroyed