当 C++ 代码在某些非 C++ 程序中使用时,C++ 运行时调用 Terminate() 是否“合法”?

2023-12-25

在某些情况下 - 特别是当异常在堆栈展开期间逃逸析构函数时 - C++ 运行时调用terminate()它必须做一些合理的事后分析,然后退出程序。当出现“为什么如此严厉”的问题时,答案通常是“在这种错误情况下没有什么比这更合理的事情了”。如果整个程序都是用 C++ 编写的话,这听起来很合理。

现在,如果 C++ 代码在库中,而使用该库的程序不在 C++ 中怎么办?这种情况经常发生 - 例如,我可能有一个由 .NET 程序使用的本机 C++ COM 组件。一次terminate()在组件代码内部调用.NET程序突然异常结束。程序作者首先会想“我不关心C++,为什么这个库会让我的程序退出?”

在 C++ 中开发库时如何处理后一种情况?是否合理terminate()程序意外结束?有没有更好的方法来处理此类情况?


为什么 C++ 运行时调用terminate()?它不是随机执行的,也不是由于编写代码时无法定义和/或避免的情况而执行的。它这样做是因为您的代码执行了一些定义为导致调用的操作terminate(),例如在堆栈展开期间从析构函数抛出异常。

C++ 标准中有一个列表,列出了定义为导致调用的所有情况terminate()。如果你不想terminate()要被调用,请不要在代码中执行任何这些操作。这同样适用于unexpected(), abort(), 等等。

我认为这与您必须避免未定义的行为或通常避免编写错误的代码这一事实没有任何不同。您还必须避免已定义但不受欢迎的行为。

也许你有一个特定的例子,很难避免调用terminate(),但在堆栈展开期间从析构函数抛出异常不是这样。只是永远不要从析构函数中抛出异常。这意味着设计您的析构函数,以便如果它们执行可能失败的操作,析构函数会捕获异常,并且您的代码将继续处于定义的状态。

在某些情况下,你的系统会因为你的 C++ 代码所做的事情而无礼地破坏你的进程(尽管不是通过调用terminate())。例如,如果系统过度使用内存并且 VMM 无法兑现承诺malloc/new已经完成,那么你的进程可能会被杀死。但这是一个系统功能,可能同样适用于调用 C++ 的其他语言。我不认为您可以(或需要)对此做任何事情,只要您的调用者知道您的库可能会分配内存。在这种情况下,进程终止并不是代码的错误,而是操作系统对内存不足情况的定义响应。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

当 C++ 代码在某些非 C++ 程序中使用时,C++ 运行时调用 Terminate() 是否“合法”? 的相关文章

  • 如何将 std::string& 转换为 C# 引用字符串

    我正在尝试将 C 函数转换为std string参考C 我的 API 如下所示 void GetStringDemo std string str 理想情况下 我希望在 C 中看到类似的东西 void GetStringDemoWrap r
  • BASIC 中的 C 语言中的 PeekInt、PokeInt、Peek、Poke 等效项

    我想知道该命令的等效项是什么Peek and Poke 基本和其他变体 用 C 语言 类似PeekInt PokeInt 整数 涉及内存条的东西 我知道在 C 语言中有很多方法可以做到这一点 我正在尝试将基本程序移植到 C 语言 这只是使用
  • STL 迭代器:前缀增量更快? [复制]

    这个问题在这里已经有答案了 可能的重复 C 中的预增量比后增量快 正确吗 如果是 为什么呢 https stackoverflow com questions 2020184 preincrement faster than postinc
  • 在 xaml 中编写嵌套类型时出现设计时错误

    我创建了一个用户控件 它接受枚举类型并将该枚举的值分配给该用户控件中的 ComboBox 控件 很简单 我在数据模板中使用此用户控件 当出现嵌套类型时 问题就来了 我使用这个符号来指定 EnumType x Type myNamespace
  • 如何在 Cassandra 中存储无符号整数?

    我通过 Datastax 驱动程序在 Cassandra 中存储一些数据 并且需要存储无符号 16 位和 32 位整数 对于无符号 16 位整数 我可以轻松地将它们存储为有符号 32 位整数 并根据需要进行转换 然而 对于无符号 64 位整
  • 如何从 Visual Studio 将视图导航到其控制器?

    问题是解决方案资源管理器上有 29 个项目 而且项目同时具有 ASP NET MVC 和 ASP NET Web 表单结构 在MVC部分中 Controller文件夹中有大约100个子文件夹 每个文件夹至少有3 4个控制器 视图完全位于不同
  • 传递给函数时多维数组的指针类型是什么? [复制]

    这个问题在这里已经有答案了 我在大学课堂上学习了 C 语言和指针 除了多维数组和指针之间的相似性之外 我认为我已经很好地掌握了这个概念 我认为由于所有数组 甚至多维 都存储在连续内存中 因此您可以安全地将其转换为int 假设给定的数组是in
  • 无限循环与无限递归。两者都是未定义的吗?

    无副作用的无限循环是未定义的行为 看here https coliru stacked crooked com view id 24e0a58778f67cd4举个例子参考参数 https en cppreference com w cpp
  • 重载 (c)begin/(c)end

    我试图超载 c begin c end类的函数 以便能够调用 C 11 基于范围的 for 循环 它在大多数情况下都有效 但我无法理解和解决其中一个问题 for auto const point fProjectData gt getPoi
  • 方程“a + bx = c + dy”的积分解

    在等式中a bx c dy 所有变量都是整数 a b c and d是已知的 我如何找到整体解决方案x and y 如果我的想法是正确的 将会有无限多个解 由最小公倍数分隔b and d 但我只需要一个解决方案 我可以计算其余的 这是一个例
  • 使用 C# 中的 CsvHelper 将不同文化的 csv 解析为十进制

    C 中 CsvHelper 解析小数的问题 我创建了一个从 byte 而不是文件获取 csv 文件的类 并且它工作正常 public static List
  • 如何获取 EF 中与组合(键/值)列表匹配的记录?

    我有一个数据库表 其中包含每个用户 年份组合的记录 如何使用 EF 和用户 ID 年份组合列表从数据库获取数据 组合示例 UserId Year 1 2015 1 2016 1 2018 12 2016 12 2019 3 2015 91
  • 两个静态变量同名(两个不同的文件),并在任何其他文件中 extern 其中一个

    在一个文件中将变量声明为 static 并在另一个文件中进行 extern 声明 我认为这会在链接时出现错误 因为 extern 变量不会在任何对象中看到 因为在其他文件中声明的变量带有限定符 static 但不知何故 链接器 瑞萨 没有显
  • C 编程:带有数组的函数

    我正在尝试编写一个函数 该函数查找行为 4 列为 4 的二维数组中的最大值 其中二维数组填充有用户输入 我知道我的主要错误是函数中的数组 但我不确定它是什么 如果有人能够找到我出错的地方而不是编写新代码 我将不胜感激 除非我刚去南方 我的尝
  • 为什么使用小于 32 位的整数?

    我总是喜欢使用最小尺寸的变量 这样效果就很好 但是如果我使用短字节整数而不是整数 并且内存是 32 位字可寻址 这真的会给我带来好处吗 编译器是否会做一些事情来增强内存使用 对于局部变量 它可能没有多大意义 但是在具有数千甚至数百万项的结构
  • 相当于Linux中的导入库

    在 Windows C 中 当您想要链接 DLL 时 您必须提供导入库 但是在 GNU 构建系统中 当您想要链接 so 文件 相当于 dll 时 您就不需要链接 为什么是这样 是否有等效的 Windows 导入库 注意 我不会谈论在 Win
  • C# 中的 IPC 机制 - 用法和最佳实践

    不久前我在 Win32 代码中使用了 IPC 临界区 事件和信号量 NET环境下场景如何 是否有任何教程解释所有可用选项以及何时使用以及为什么 微软最近在IPC方面的东西是Windows 通信基础 http en wikipedia org
  • C++ 继承的内存布局

    如果我有两个类 一个类继承另一个类 并且子类仅包含函数 那么这两个类的内存布局是否相同 e g class Base int a b c class Derived public Base only functions 我读过编译器无法对数
  • C++ 中的 include 和 using 命名空间

    用于使用cout 我需要指定两者 include
  • 当文件流没有新数据时如何防止fgets阻塞

    我有一个popen 执行的函数tail f sometextfile 只要文件流中有数据显然我就可以通过fgets 现在 如果没有新数据来自尾部 fgets 挂起 我试过ferror and feof 无济于事 我怎样才能确定fgets 当

随机推荐

  • 使用继承序列化包含对象的 Doctrine 数组

    Problem 当序列化 Doctrine 实体的集合时 该集合仍将有 2 个项目 尽管这些项目是空的 背景 我有一些相互扩展的实体B延伸A and C延伸B 在实体内Test我有一个包含该类型对象的数组B test在序列化时将具有预期值
  • 我的编译器会忽略无用的代码吗?

    我已经通过网络询问了有关此主题的一些问题 但我没有找到我的问题的任何答案 或者它是对于另一种语言 https stackoverflow com q 30703896 2307070或者它没有完全回答 https stackoverflow
  • 在android模拟器中创建文件

    我在创建文件时遇到一些问题 例如 我想在 SD 卡上创建一个文件 首先我想检查文件是否存在 如果文件不存在 我将创建一个并写入一些文本 否则如果文件存在 我将在其中附加一些文本 String state Environment getExt
  • 当源数据更改时如何更新数据绑定组合框?

    我正在开发适用于 Windows 8 的 C Metro 风格应用程序 并且在源数据更改时更新数据绑定组合框时遇到问题 这是数据源 public class Range public string range name get set pu
  • 运行performSelector:在返回双精度值而不是id的对象上

    如何在返回值是 double 的对象上运行任意选择器 例如 我有 obj A 它有方法 double b lah 我能怎么做double res obj performSelector selector blah 执行选择器返回一个id类型
  • CakePHP 中的多重计数

    我有一个使用 CakePHP 的 PHP 应用程序 我需要提供一个表格 显示该月每一天的特定事件的计数 每个事件都以名称和数据记录在数据库中 为此创建表的最佳方法是什么 我真的需要执行 31 个 SQL 调用来计算每天的事件 还是取出整个月
  • ASP.Net TreeView 将选定的节点滚动到视图中

    有没有办法在回发后将 ASP Net TreeView 的选定节点滚动到视图中 在我的特定场景中 每次回发后都会重新填充控件 Thanks 我想到了 TreeView 控件在客户端上创建一个 javascript 对象 它被命名为您所称的树
  • WPF 中 DataGridColumn 的绑定可见性

    如何隐藏 WPF 中的列DataGrid通过绑定 这就是我所做的
  • HTML 按钮类似于 ASP.NET 按钮

    如何像 ASP NET 按钮一样使用 HTML 按钮 Html 标签归因于runat server 被称为 HtmlControls 并且你需要处理ServerClick event Markup
  • 使用 XML 而不是通过注释来配置 hibernate 是否有充分的理由?

    我已经使用 Hibernate 几年了 但仅将其与注释一起使用 并在代码中设置连接参数 我是否因为不使用 XML 文件而 遗漏了一些东西 是否存在仅在 XML 中可用的重要功能 是否存在使用 XML 有意义的情况或模式 我认为可以肯定地说您
  • JavaScript:在一台虚拟机中进行所有评估

    我正在创建一个自定义 JavaScript 控制台 我希望它的工作方式与开发工具中的控制台完全相同 或者 类似 REPL 的东西 https github com MohammadMD1383 js interactive https gi
  • 使用 PHP DOM 在 html 标签开头插入创建的元​​素

    我正在尝试插入 HTML打开后立即标记使用 dom 的页面标签 我尝试过使用appendChild它只是将其插入之前这可不行 我使用的代码 head dom gt getElementsByTagName head gt item 0 ba
  • EF 4.1 异常“提供程序未返回 ProviderManifestToken 字符串”

    我正在尝试复制 MSDN 上找到的示例 我正在使用 ASP NET 和 EF 4 1 CTP 我使用 NuGet 来安装 EntityFramework 包 我收到此错误 The provider did not return a Prov
  • Mapbox 地图在 Android 上不显示

    当我前几次测试它时 它显示得非常好 然后我添加了一些代码 它就停止了 它仍然在左下角屏幕上显示 Mapbox 徽标 但没有加载地图 这是上面的代码MapActivity public class MapActivity extends Ap
  • Kotlin setOnClickListener 使用方法引用不起作用

    我尝试以与 Java 中相同的方式使用方法引用 button setOnClickListener this clickListener 使用科特林 button setOnClickListener this clickListener
  • 使用 FFTW 进行图像卷积时,内核在哪里居中?

    我正在尝试使用 FFTW 进行图像卷积 起初只是为了测试系统是否正常工作 我执行了 fft 然后执行了逆 fft 并且可以返回完全相同的图像 然后向前迈出了一小步 我使用了恒等内核 即 kernel 0 0 1 而所有其他组件等于 0 我取
  • MySQL 在表中向 UUID 添加破折号

    有没有一种简单的方法来转换这种格式的 UUID 5967ca5e6162317eb4a825dcdcde0aea 到这个格式 5967ca5e 6162 317e b4a8 25dcdcde0aea 使用 MySQL 查询 我需要转换超过
  • 如何防止整个类被序列化?

    我正在使用 Newtonsoft Json 来序列化一个类及其所有成员 有一个特定的类 它的许多成员都是其实例 我只想告诉一个类根本不被序列化 因此如果任何属于该类型实例的成员都会被跳过 在 C 中是否可以通过向类附加某种属性来将其标记为不
  • Eclipse 清理 - 什么是“.index”文件 - 我可以安全地删除它们吗?

    尝试减小我的 数据库同步 工作区的大小 意识到该文件夹 workspace loc metadata plugins org eclipse jdt core 占用约 35 MB 文件夹的内容是 index文件 占用最多空间 和其他一些文件
  • 当 C++ 代码在某些非 C++ 程序中使用时,C++ 运行时调用 Terminate() 是否“合法”?

    在某些情况下 特别是当异常在堆栈展开期间逃逸析构函数时 C 运行时调用terminate 它必须做一些合理的事后分析 然后退出程序 当出现 为什么如此严厉 的问题时 答案通常是 在这种错误情况下没有什么比这更合理的事情了 如果整个程序都是用