gpt4 book ai didi

c++ - C++ 中的 exit 和 std::exit 有什么区别?

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:05:26 29 4
gpt4 key购买 nike

exit 和 C++ 中的 std::exit 有什么区别?我已经对其进行了研究,但我找不到任何东西。

这两个代码有什么区别:

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 库中。特别是,

  1. exit首先销毁与当前线程关联的具有线程存储持续时间的所有对象。
  2. 具有静态存储持续时间的对象被销毁,所有使用atexit注册的函数被调用。
    • 如果其中之一抛出未被捕获的异常,terminate被调用。
  3. 之后我们得到正常的 C 行为:
    • 如果有未写入的数据,打开的 C 流将被刷新,然后关闭。
    • 通过调用 tmpfile 创建的文件被删除。
    • 控制返回到主机环境,返回成功或失败取决于调用exit 时传递的值(0EXIT_SUCCESS => 成功,EXIT_FAILURE => 失败,其他任何内容均由实现定义)。

请特别注意本地对象不会被任何退出调用破坏。

这意味着,实际上,您真的应该忘记以上所有内容,并且永远不要调用exit/std::exit来自 C++ 代码。虽然委员会显然认为与 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++ - C++ 中的 exit 和 std::exit 有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38724788/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com