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

2024-02-20

有什么区别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 库中。尤其,

  1. exit首先销毁与当前线程关联的具有线程存储持续时间的所有对象。
  2. Objects with static storage duration are destroyed, and any functions registered with atexit are invoked.
    • 如果其中之一抛出未捕获的异常,terminate被调用。
  3. 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(使用前将#替换为@)

C++ 中的 exit 和 std::exit 有什么区别? 的相关文章

随机推荐

  • Tomcat 7 - 保护 webapps 文件夹下的文件夹

    我的网络应用程序是 myweb 在此网络应用程序中 我的代码引用 files 文件夹下的 123 pdf 例如 http localhost 8080 files 123 pdf webapps myweb files 123 pdf 当我
  • NodeJS:如何像C#一样生成Rfc2898DeriveBytes?

    我正在尝试使用 NodeJS 加密库和 C Rfc2898DeriveBytes 生成相同的密码哈希 使用 C 生成的 salt 时 NodeJs 实现不会生成相同的密钥 我究竟做错了什么 在 C 中 public static strin
  • symfony2 主义 onetoone 完整示例

    我尝试从示例中建立onetoone关系 http docs doctrine project org en latest tutorials composite primary keys html use case 2 simple dri
  • SQL Server 通知 - 我的 OnChange 不触发

    我想利用 SQL Server 通知来捕获 winforms 应用程序中数据库中的插入事件 我正在尝试使用 SQLDependency 对象 MSDN 文章使这看起来非常简单 所以我创建了一个小示例应用程序来尝试一下 该事件似乎仅在我第一次
  • HTML 表格列宽:固定宽度和可变宽度的结合

    我做了一个这样的表格 table style width 100 tr td aaa td td td td class fixed width bbb td td class fixed width ccc td tr table 我将如
  • Pycharm 中模板的自动完成功能

    每当我创建一个函数 将其设为视图并将模板映射到其上时 PyCharm 中的自动完成功能都会起作用 如果您输入类似的内容 book where book是一个模型 并且是您的上下文对象之一 那么它将为您提供一个包含可能完成的下拉菜单 但是 如
  • rand() 在 OS X Mavericks/XCode 5.1 上损坏? (或者,“这是一个巨大的安全漏洞,还是我只是一个糟糕的程序员?”)[重复]

    这个问题在这里已经有答案了 以下代码片段随机打乱 STL 整数数组 它在 Ubuntu 和 Red Hat 上都能正常工作 然而 在我的 Mac OS X 机器上 数组每次都会按照相同的顺序进行洗牌 代码的第二部分打印随机数生成器的输出 这
  • IronRuby 性能?

    虽然我知道 IronRuby 还没有准备好让全世界使用它 但我想知道这里是否有人尝试过它并测试它在原始性能方面与其他红宝石相比的表现如何 如果是这样 结果是什么 您是如何衡量性能的 哪些基准等 Edit IronRuby 团队维护了一个网站
  • 如何在剃刀代码块中插入空格?

    VS2013 MVC5 剃刀 VB 我希望 已答复 一词前面有空格 如何在以下 Razor 代码块中强制添加空格 Code If Model DisplayAnsweredFlag Then If Model Answered Then H
  • 将 python3.5 设置为 AWS 中的默认值?

    有没有办法让python3 5成为AWS中的默认python 每次我尝试下一次连接时 python2 7 是默认版本 pip 6 是最后一个版本 知道我在几分钟前更新了它 这是我遵循的方法 亚马逊 链接 http docs aws amaz
  • 了解 gsl::narrow 实现

    The C 核心指南 https github com isocpp CppCoreGuidelines blob master CppCoreGuidelines md has a narrow如果强制转换更改了值 则会抛出异常 看着微软
  • SELECT * 中有时会缺少计算列

    在 SQL Azure 中 我有一个或多或少像这样设置的表 其中有两个计算列 IsExpired and IsDeadlineExpired 简单地将不可为 null 的日期时间列与当前时间进行比较 CREATE TABLE dbo Stu
  • 带有预定义关键字参数的define_method

    我想定义一个采用关键字参数的方法 我希望它在未提供关键字参数时引发 并且我可以自己编写代码 但理想情况下我想让 Ruby 为我做这件事 另外我希望能够使用检查新定义的方法Method parameters 如果我使用速记 double sp
  • 覆盖rails update_all方法

    我需要覆盖轨道 活动记录 update all方法 以便它始终更新updated at场也是如此 我应该如何实现这一目标 将以下代码放入文件中 config initializers update all with touch rb cla
  • 将用户定义的库添加到 SVN

    我正在开发一个项目 我使用了许多外部库 jar 格式 我已将下载的所有外部 jar 添加到版本控制 subversion 的构建路径中 然而 最近我注意到许多库并不在 SVN 树中 我对此进行了一些研究 这些是我作为用户定义的库创建的库 并
  • 在函数中使用全局变量

    如何在函数内创建或使用全局变量 如何在一个函数中在其他函数中使用定义的全局变量 Failing to use the global keyword where appropriate often causes UnboundLocalErr
  • PostgreSQL 自定义异常?

    在 Firebird 中我们可以像这样声明自定义异常 CREATE EXCEPTION EXP CUSTOM 0 异常 自定义异常 这些存储在数据库级别 在存储过程中 我们可以像这样引发异常 异常 EXP CUSTOM 0 PostgreS
  • Cakephp - HABTM 记录不会在唯一设置为 true 时删除

    CakePHP 的默认值 unique 设置为 true 我对其进行编码也是为了确保这一点 所以我有以下数据库结构 项目 HABTM 操作 将 unique 设置为 true 情况如下 当我删除 1 条或多条记录时 如果至少 1 条记录保持
  • 有没有办法从 Java Play 2 框架中的数据库生成代码?

    有谁知道如何在 Play Framework 2 0 中轻松地从数据库生成代码 我知道他们有一个模块 但似乎这是 1 X 版本的 Anyone CRUD 模块仅适用于 Play 1 2 x 在 Play 2 0 中不可用 它可能会在 Pla
  • C++ 中的 exit 和 std::exit 有什么区别?

    有什么区别exit and std exit在 C 中 我已经研究过但我找不到任何东西 这两个代码有什么区别 1 if SDL Init SDL INIT EVERYTHING 0 std cout lt lt Error Can t in