我意识到这个问题已经出现过几次了,但我正在努力为上述问题找到明确的答案,但我不断遇到相互矛盾的信息。我需要知道的是,当我使用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);
}
是我的意图的一个粗略的例子。
答案 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)修改内存,你无法分辨,因为修改与封闭过程没有更多关联。