是否在Exit()上调用基本对象析构函数?

时间:2015-10-24 03:12:46

标签: c++ class destructor exit

我意识到这个问题已经出现过几次了,但我正在努力为上述问题找到明确的答案,但我不断遇到相互矛盾的信息。我需要知道的是,当我使用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;
}

现在,如果我从main中删除exit(1),则会按预期打印“Object destroyed”和“Hello”。但是将它留在那里,都没有打印出来。 “Hello”的原因很明显,但我认为emp1仍然会被破坏,但是destruct消息没有显示......

我正在查看this link,它说的是静态物体被摧毁。上述对象不被视为静态吗?

如果没有,有没有办法让程序在没有内存的情况下终止?我的项目围绕用户输入,我试图在用户输入“退出”一词时提供退出选项。

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

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

4 个答案:

答案 0 :(得分:2)

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

static employee emp1;

第二个注意事项。每当您使用cout调试边缘情况,时序关键调试等时,您应该在cout.flush()之后添加cout,以确保在输出之前打印输出。我见过很多人使用cout来调试崩溃,并且输出永远不会打印,因为程序在操作系统有机会打印输出之前终止。

答案 1 :(得分:1)

您的emp1变量已在堆栈上分配。 exit不会破坏基于本地堆栈的变量。

答案 2 :(得分:1)

你可以扔掉。例外情况将清除展开的范围。

//...
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

答案 3 :(得分:1)

  

我需要知道的是,如果基本类对象在我被破坏时被破坏   使用exit()。

你已经证明它没有。 os服务标记为&#39;退出&#39;这样做而不用担心代码问题。请注意,退出存在于C ++之前。

  

有没有办法让程序在没有它的情况下终止   存储器?

您已经证明退出至少是一种在不调用C ++析构函数的情况下终止程序的方法。退出是语言agnositic

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

记忆中的内存是什么?

b)退出(和主要返回)处理的一部分是操作系统将回收该进程的所有内存资源。记忆不会被搞砸#39; with,(没有析构函数,没有&#39;擦除&#39;擦除&#39;)。

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

如果b)或c)修改内存,你无法分辨,因为修改与封闭过程没有更多关联。