有什么区别exit
and std::exit
在 C++ 中?我已经研究过但我找不到任何东西。
这两个代码有什么区别:
1:
if(SDL_Init(SDL_INIT_EVERYTHING) != 0)
{
std::cout << "Error: Can't initialize the SDL \n";
exit(EXIT_FAILURE);
}
2:
if(SDL_Init(SDL_INIT_EVERYTHING) != 0)
{
std::cout << "Error: Can't initialize the SDL \n";
std::exit(EXIT_FAILURE);
}
它们是执行相同操作的同一函数的两个名称。
但请注意,在 C++ 中std::exit
/exit
(不管你如何得到它的名字)确实有一些未指定的行为exit
在 C 库中。尤其,
-
exit
首先销毁与当前线程关联的具有线程存储持续时间的所有对象。
- Objects with static storage duration are destroyed, and any functions registered with
atexit
are invoked.
- 如果其中之一抛出未捕获的异常,
terminate
被调用。
- After that we get the normal C behavior:
- 如果打开的 C 流有未写入的数据,则会刷新它们,然后将其关闭。
- 通过调用创建的文件
tmpfile
被删除。
- 控制权返回到主机环境,根据调用中传递的值返回成功或失败
exit
(0
or EXIT_SUCCESS
=> 成功,EXIT_FAILURE
=> 失败,其他任何内容都是实现定义的)。
特别注意本地对象是not被任何退出调用破坏。
实际上,这意味着您应该真正忘记上述所有内容,并且简单地never call exit
/std::exit
来自 C++ 代码。虽然委员会显然认为与 C 代码的兼容性是一个足够强大的动机,以至于他们need如果将其保留在标准中,您当然不需要使用它 - 并且在几乎任何合理的正常情况下,您都不应该使用它。在退出作用域时销毁本地对象是 C++ 中非常重要的一部分,因此像这样的函数exit
消除这种保证几乎只会导致头痛。
如果您需要的行为与exit
,你通常想做这样的事情:
struct my_exit : public std::exception {
int value;
my_exit(int value) : value(value) {}
};
int main() {
try {
// do normal stuff
}
catch(my_exit const &e) {
return e.value;
}
}
然后在代码的其余部分中,否则您会调用exit
,你代替throw my_exit(whatever_value);
。这样,所有局部变量都将被销毁(即,将发生堆栈展开)并且then您将正常退出环境。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)