what is the difference between exit and std::exit in C++?(在C++中,Exit和std::Exit有什么不同?)
本文介绍了在C++中,Exit和std::Exit有什么不同?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
在C++中exit
和std::exit
有什么区别?我研究过了,但什么也找不到。
这两个代码有什么区别:
1:
if(SDL_Init(SDL_INIT_EVERYTHING) != 0)
{
std::cout << "Error: Can't initialize the SDL
";
exit(EXIT_FAILURE);
}
2:
if(SDL_Init(SDL_INIT_EVERYTHING) != 0)
{
std::cout << "Error: Can't initialize the SDL
";
std::exit(EXIT_FAILURE);
}
推荐答案
它们是执行相同操作的同一函数的两个名称。
但是,请注意,在C++中,std::exit
/exit
(无论您如何找到它的名称)确实有一些在C库中没有为exit
指定的行为。特别是,
exit
首先销毁与当前线程关联的具有线程存储持续时间的所有对象。- 具有静态存储时长的对象被销毁,并调用向
atexit
注册的任何函数。- 如果其中一个引发未捕获的异常,则调用
terminate
。
- 如果其中一个引发未捕获的异常,则调用
- 之后,我们得到正常的C行为:
- 如果打开的C流有未写入的数据,则刷新它们,然后关闭它们。
- 通过调用
tmpfile
创建的文件将被删除。 - 将控制权返回到宿主环境,根据调用
exit
(0
或EXIT_SUCCESS
=>Success,EXIT_FAILURE
=>Failure,其他值由实现定义)返回Success或Failure。
请特别注意,本地对象不会被任何Exit调用销毁。
实际上,这意味着您应该真正忘记上面的所有内容,并简单地永远不要从C++代码调用exit
/std::exit
。虽然委员会显然认为与C代码的兼容性是他们需要将其保留在标准中的足够强大的动机,但您肯定不需要使用它--在几乎任何合理的正常情况下,您都不应该使用它。从作用域退出时销毁本地对象是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);
。这样,所有局部变量都将被销毁(即将发生堆栈展开),然后您将正常退出环境。
这篇关于在C++中,Exit和std::Exit有什么不同?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
沃梦达教程
本文标题为:在C++中,Exit和std::Exit有什么不同?
基础教程推荐
猜你喜欢
- 如何定义双括号/双迭代器运算符,类似于向量的向量? 2022-01-01
- 如何在 C++ 中处理或避免堆栈溢出 2022-01-01
- C++ 程序在执行 std::string 分配时总是崩溃 2022-01-01
- C++ 标准:取消引用 NULL 指针以获取引用? 2021-01-01
- 调用std::Package_TASK::Get_Future()时可能出现争用情况 2022-12-17
- C++,'if' 表达式中的变量声明 2021-01-01
- 运算符重载的基本规则和习语是什么? 2022-10-31
- 您如何将 CreateThread 用于属于类成员的函数? 2021-01-01
- 设计字符串本地化的最佳方法 2022-01-01
- 什么是T&&(双与号)在 C++11 中是什么意思? 2022-11-04