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 有什么区别? 的相关文章

  • 通过 CMIS (dotCMIS) 连接到 SP2010:异常未经授权

    我正在使用 dotCMIS 并且想要简单连接到我的 SP2010 服务器 我尝试用 C 来做到这一点 如下所示http chemistry apache org dotnet getting started with dotcmis htm
  • 秒表有最长运行时间吗?

    多久可以Stopwatch在 NET 中运行 如果达到该限制 它会回绕到负数还是从 0 重新开始 Stopwatch Elapsed返回一个TimeSpan From MSDN https learn microsoft com en us
  • 在 Windows 窗体中保存带有 Alpha 通道的单色位图会保存不同(错误)的颜色

    在 C NET 2 0 Windows 窗体 Visual Studio Express 2010 中 我保存由相同颜色组成的图像 Bitmap bitmap new Bitmap width height PixelFormat Form
  • Clang 3.1 + libc++ 编译错误

    我已经构建并安装了 在前缀下 alt LLVM Clang trunk 2012 年 4 月 23 日 在 Ubuntu 12 04 上成功使用 GCC 4 6 然后使用此 Clang 构建的 libc 当我想使用它时我必须同时提供 lc
  • 堆栈溢出:堆栈空间中重复的临时分配?

    struct MemBlock char mem 1024 MemBlock operator const MemBlock b const return MemBlock global void foo int step 0 if ste
  • C++ OpenSSL 导出私钥

    到目前为止 我成功地使用了 SSL 但遇到了令人困惑的障碍 我生成了 RSA 密钥对 之前使用 PEM write bio RSAPrivateKey 来导出它们 然而 手册页声称该格式已经过时 实际上它看起来与通常的 PEM 格式不同 相
  • 带动态元素的 WPF 启动屏幕。如何?

    我是 WPF 新手 我需要一些帮助 我有一个加载缓慢的 WPF 应用程序 因此我显示启动屏幕作为权宜之计 但是 我希望能够在每次运行时更改屏幕 并在文本区域中显示不同的引言 这是一个生产力应用程序 所以我将使用非愚蠢但激励性的引言 当然 如
  • 将多个表映射到实体框架中的单个实体类

    我正在开发一个旧数据库 该数据库有 2 个具有 1 1 关系的表 目前 我为每个定义的表定义了一种类型 1Test 1Result 我想将这些特定的表合并到一个类中 当前的类型如下所示 public class Result public
  • WCF 中 SOAP 消息的数字签名

    我在 4 0 中有一个 WCF 服务 我需要向 SOAP 响应添加数字签名 我不太确定实际上应该如何完成 我相信响应应该类似于下面的链接中显示的内容 https spaces internet2 edu display ISWG Signe
  • 使用 Bearer Token 访问 IdentityServer4 上受保护的 API

    我试图寻找此问题的解决方案 但尚未找到正确的搜索文本 我的问题是 如何配置我的 IdentityServer 以便它也可以接受 授权带有 BearerTokens 的 Api 请求 我已经配置并运行了 IdentityServer4 我还在
  • 如何在 C 中调用采用匿名结构的函数?

    如何在 C 中调用采用匿名结构的函数 比如这个函数 void func struct int x p printf i n p x 当提供原型的函数声明在范围内时 调用该函数的参数必须具有与原型中声明的类型兼容的类型 其中 兼容 具有标准定
  • 这些作业之间是否存在顺序点?

    以下代码中的两个赋值之间是否存在序列点 f f x 1 1 x 2 不 没有 在这种情况下 标准确实是含糊不清的 如果你想确认这一点 gcc 有这个非常酷的选项 Wsequence point在这种情况下 它会警告您该操作可能未定义
  • 使用 x509 证书签署 json 文档或字符串

    如何使用 x509 证书签署 json 文档或字符串 public static void fund string filePath C Users VIKAS Desktop Data xml Read the file XmlDocum
  • 链接器错误:已定义

    我尝试在 Microsoft Visual Studio 2012 中编译我的 Visual C 项目 使用 MFC 但出现以下错误 error LNK2005 void cdecl operator new unsigned int 2
  • WPF/C# 将自定义对象列表数据绑定到列表框?

    我在将自定义对象列表的数据绑定到ListBox in WPF 这是自定义对象 public class FileItem public string Name get set public string Path get set 这是列表
  • 通过指向其基址的指针删除 POD 对象是否安全?

    事实上 我正在考虑那些微不足道的可破坏物体 而不仅仅是POD http en wikipedia org wiki Plain old data structure 我不确定 POD 是否可以有基类 当我读到这个解释时is triviall
  • 如何在Xamarin中删除ViewTreeObserver?

    假设我需要获取并设置视图的高度 在 Android 中 众所周知 只有在绘制视图之后才能获取视图高度 如果您使用 Java 有很多答案 最著名的方法之一如下 取自这个答案 https stackoverflow com a 24035591
  • 将控制台重定向到 .NET 程序中的字符串

    如何重定向写入控制台的任何内容以写入字符串 对于您自己的流程 Console SetOut http msdn microsoft com en us library system console setout aspx并将其重定向到构建在
  • 哪种 C 数据类型可以表示 40 位二进制数?

    我需要表示一个40位的二进制数 应该使用哪种 C 数据类型来处理这个问题 如果您使用的是 C99 或 C11 兼容编译器 则使用int least64 t以获得最大的兼容性 或者 如果您想要无符号类型 uint least64 t 这些都定
  • 如何将服务器服务连接到 Dynamics Online

    我正在修改内部管理应用程序以连接到我们的在线托管 Dynamics 2016 实例 根据一些在线教程 我一直在使用OrganizationServiceProxy out of Microsoft Xrm Sdk Client来自 SDK

随机推荐

  • 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