捕获 C++ 库崩溃的一致方法

2024-02-20

我浏览了不同的网站,除了那些似乎不起作用的网站之外,找不到这个问题的任何答案。正如标题所示,我正在尝试找到一种方法来捕获我正在处理的库是否崩溃。我有一个 Root 类,它保存我的库中的许多管理器样式类的实例,并在其析构函数中释放这些实例。当然,管理器负责相当多的数据,因此如果没有正确处理它们,就有可能出现相当不可接受的甚至危险的内存泄漏程度。

我知道,当程序崩溃时,操作系统将释放该程序的堆栈空间,但这不包括调用已分配对象的析构函数。它还不包括删除执行期间分配的任何堆,这就是我处理库中大量内存的方式,这又回到了广泛的内存泄漏问题。

我在其他网站上遇到的很多答案只是说要注册一个函数atexit(),但是如果应用程序崩溃,该功能将不起作用。而且,如上所述,由于崩溃不会调用析构函数,因此无法创建一个在销毁时关闭所有内容的全局单例,这是我处理此问题的最初想法。我的另一个想法是希望库的最终用户能够采取适当的预防措施来避免崩溃(通过广泛使用异常抛出),但我觉得这违背了良好编码库的想法,坦率地说,我认为它要求最终用户处理这个问题。

所以我想我的 TL;DR 问题是这样的:有没有办法通过标准 C++ 函数或某种管理器类来捕获库崩溃并适当处理它?

编辑:另外,我真的更喜欢一种跨平台的方式来处理这个问题。我的代码库大量使用 C++11 的功能,因此我以编程方式将可用编译器限制为最新版本的 GCC 和 Clang。

不仅如此,我还有几个类,例如 Logger,它们将关闭文件系统的流并打印出一些有关退出状态的消息。我还有一个内存跟踪器,可以报告文件中任何可能的内存泄漏,但仅限于其析构函数。


“有没有办法通过标准 C++ 函数或某种管理器类来捕获库崩溃并进行适当处理?”

对于你的问题,我能想到的最简洁的答案是:

坚持类别和类别C++ 标准错误处理 http://en.cppreference.com/w/cpp/error.


正如你所要求的atexit(),该行为在标准参考 http://en.cppreference.com/w/cpp/utility/program/atexit以及。

Note还有进一步的处理程序机制,例如std::terminate_handler http://en.cppreference.com/w/cpp/error/terminate_handler,允许您以便携且符合标准的方式处理一些异常中止情况。

最后但并非最不重要的一点是,可能需要安装某些(特定于操作系统)信号处理程序 http://en.cppreference.com/w/cpp/utility/program/signal,以捕获错误,例如所谓的分段故障 (SIGSEV) http://en.cppreference.com/w/cpp/utility/program/SIG_types由于堆栈溢出或类似的事情而引发。

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

捕获 C++ 库崩溃的一致方法 的相关文章

  • 高级 Win32 图像文件 I/O?

    我想在 Windows C 应用程序中将图像文件读入内存 什么是一个相当简单的解决方案 也许类似于 IOS 提供的UIImage 我希望支持合理数量的文件格式 我需要为图像处理的位图提供一些低级访问权限 我在互联网上阅读了很多内容 看起来
  • 当我单击 GridView 项时返回 ImageView 实例

    当我点击GridView项时如何返回ImageView实例 我为 ItemClick 创建自定义绑定事件 public class ItemClickSquareBinding MvxBaseAndroidTargetBinding pri
  • 字节到二进制字符串 C# - 显示所有 8 位数字

    我想在文本框中显示一个字节 现在我正在使用 Convert ToString MyVeryOwnByte 2 但是 当字节开头有 0 时 这些 0 就会被删除 例子 MyVeryOwnByte 00001110 Texbox shows g
  • 使用 VSTO 更改 Outlook 设置

    我刚刚花了大约 4 个小时试图弄清楚如何以编程方式检索 设置 Microsoft Outlook 2010 的 Outlook 设置 我所说的 设置 是指文件 选项 邮件下的设置 我想做的是检索用户设置的设置列表 自动化我们每天需要在某些消
  • C++ 在 Vector 中使用不可分配的对象

    我想将对象列表存储在std vector 但对象包含引用且无法分配给 但是 我可以复制构造该对象 我能想到的唯一选择是使用指针来包装对象并在需要分配指针时重新设置指针 但这样做的语法会显着降低可读性 特别是在使用迭代器时 我更喜欢另一种选择
  • Qt中正确的线程方式

    我的图像加载非常耗时 图像很大 并且在加载时也完成了一些操作 我不想阻止应用程序 GUI 我的想法是在另一个线程中加载图像 发出图像已加载的信号 然后用该图像重绘视图 我的做法 void Window loadImage ImageLoad
  • 控制台应用程序 .net Core 2.0 的配置

    在 net Core 1 中我们可以这样做 IConfiguration config new ConfigurationBuilder AddJsonFile appsettings json true true Build 这样就可以使
  • 成员初始值设定项列表中的求值顺序是什么?

    我有一个带有一些参数的构造函数 我假设它们是按照列出的顺序初始化的 但在一种情况下 它们似乎是按相反的顺序初始化的 导致中止 当我反转参数时 程序停止中止 下面是我正在使用的语法的示例 a 之前需要初始化b 在这种情况下 你能保证这个初始化
  • CMake - 将预构建库链接到 C# 项目

    我正在使用 CMake 构建 C 库 该库依赖于已构建的库 dll 我似乎无法让图书馆链接到我的图书馆 我尝试过使用target link libraries mylib external lib 我也尝试过暴力破解 reference e
  • for 循环 - 没有效果的语句

    由于某种原因 我收到错误 statement with no effect关于这个声明 for j idx j lt iter j increment printf from loop idx i int idx punc ctxt j 你
  • 在生产者-消费者情况下使用条件变量

    我正在尝试了解条件变量以及如何在生产者 消费者情况下使用它 我有一个队列 其中一个线程将数字推入队列 而另一个线程从队列中弹出数字 当生产线程放置一些数据时 我想使用条件变量向消费线程发出信号 问题是有时 或大多数时候 它只将最多两个项目推
  • C#:如何使用 SHOpenFolderAndSelectItems [重复]

    这个问题在这里已经有答案了 有人可以举例说明如何使用 shell 函数吗SH打开文件夹并选择项目 http msdn microsoft com en us library bb762232 VS 85 aspx来自 C 我不太明白如何使用
  • 在可观察项目生成时对其进行处理

    我有一个IObservable它会生成一次性物品 并且在其生命周期内可能会生成无限数量的物品 因此 我想在每次生成新项目时处理最后一个项目 因此Using http reactivex io documentation operators
  • 编写专门用于类及其子类的函数模板

    我正在尝试编写一个函数模板 一个版本应该用于不满足另一版本标准的所有类型 当参数是给定类的基类或该类本身时 应使用另一个版本 我尝试过超载Base 但是当类派生自Base 他们使用通用的 而不是特定的 我也尝试过这种 SFINAE 方法 s
  • 用 C# 编写的带有点击移动的 WPF 游戏

    我试图将标签网格移动到鼠标的位置 就像冒险游戏中的移动一样 理想情况下 我会在途中删除并重新绘制它们 但是 现在我只想弄清楚如何将 int 转换为厚度或 pointtoscreen 到目前为止我有 player XMove int Mous
  • C# ToString("MM/dd/yy") 删除前导 0 [重复]

    这个问题在这里已经有答案了 可能的重复 格式化 NET DateTime Day 不带前导零 https stackoverflow com questions 988353 format net datetime day with no
  • 在 MVVM 中,可以在视图后面的代码中访问 ViewModel 吗?

    在 MVVM 模式中 是否可以接受甚至可以访问视图代码后面的 ViewModel 属性 我有一个可观察的集合 它填充在 ViewModel 中 我需要在视图中使用它来绑定到带有链接列表的无限滚动条 IE private LinkedList
  • 多个同名内存数据库

    关系到这个答案 https stackoverflow com a 48446491 596758 我试图通过设置让多个上下文工作UseInMemoryDatabase以同名 下面的测试失败 第二个上下文为空 我还需要做什么才能在内存数据库
  • 有没有办法让 VS2010 在我的方法中扩展或收缩 try 块?

    我的代码有很多 try catch finally 块 与我在 VS2010 中的方法不同 除了添加区域之外 我无法在开发时扩展或收缩这些区域来隐藏内容 try vm R vm Qu vm T vm D vm Fil vm Type vm
  • 从 C# 中的 .NET SecureString 读取单个字符?

    WPF 的PasswordBox 返回一个SecureString 它对窥探者隐藏密码 问题是你最终必须获得密码的值 而我在网上找到的建议都涉及将值复制到字符串中 这会让你回到窥探者的问题 IntPtr bstr Marshal Secur

随机推荐

  • GHCi 中的类型家庭恶作剧

    这是我的代码 LANGUAGE TypeFamilies TypeOperators DataKinds PolyKinds FlexibleContexts UndecidableInstances module Foo where im
  • Android Studio - Gradle 清单合并失败

    我正在 android studio 中使用 actionbar sherlock 构建一个演示应用程序 我遇到了问题 在以下链接中提到 上一个问题 https stackoverflow com questions 17945111 ac
  • 错误(2,7):PLS-00428:此 SELECT 语句中需要 INTO 子句

    我正在尝试创建此触发器并收到以下编译器错误 create or replace TRIGGER RESTAR PLAZAS AFTER INSERT ON PLAN VUELO BEGIN SELECT F NRO VUELO M CAPA
  • Rust,如何使用DLL中的全局变量? C++ 等效项需要 __declspec(dllimport)

    Edit 经过一番研究 我找到了部分解决方案 这link name属性 https doc rust lang org reference items external blocks html the link name attribute
  • 如何使用c#检查程序中的图像质量?

    我想使用我的应用程序检查照片是否适合打印 我该怎么做 我对照片质量不太了解 每张照片的分辨率是否相同 我认为您可以确定地检查打印质量的唯一因素 因为其他因素是主观的 是图像的分辨率与预期的打印尺寸 如果您有其他具体要求 例如图像必须是彩色的
  • Python multiprocessing - 跟踪pool.map操作的过程

    我有一个执行一些模拟的功能 返回字符串格式的数组 我想运行模拟 函数 变化的输入参数值 超过 10000 个可能的输入值 并将结果写入单个文件 我正在使用多处理 特别是 pool map 函数 并行运行模拟 整个过程运行模拟功能超过1000
  • 如何将 Facebook onelogin 事件绑定到自定义按钮?

    我知道如何使用自定义按钮作为 Facebook 登录 现在我想bind onlogin事件到自定义按钮 但我不知道该怎么做 原始代码
  • 唯一索引不适用于 Mongoose / MongoDB

    我在使用 Mongoose MongoDb 创建唯一索引时遇到问题 无法让它工作 当我设置唯一索引时 我可以添加两个具有相同属性值的文档 我已经尝试了我能想到的一切 重新启动 一切 更改语法等 Code Addtion gt gt 这是我用
  • MongoDB 如何评估多个 $or 语句?

    MongoDB 将如何评估此查询 db testCol find or a 1 b 12 b 9 c 15 c 10 d foo 当扫描文档中的值时 如果第一个 OR 语句为 TRUE 其他语句也会被评估吗 从逻辑上讲 如果 MongoDB
  • 如何防止 UIButton 在按下时突出显示?

    When an UIButton按下后 正常情况是它会突出显示 即阴影层会覆盖图像 有没有办法防止这种情况发生 有没有一个属性可以处理这个问题 通常 您不会使用 Xcode 按按钮 而是使用手指 或鼠标 但撇开挑剔不谈 adjustsIma
  • 使用 JQuery Mobile 向上或向下移动控制组中的多个链接

    这是我上一个问题的后续问题 控制组 JQuery Mobile 上有 3 个水平按钮 多行 https stackoverflow com questions 26088729 controlgroup 3 buttons horizont
  • 使用 JS 在 Google Apps 脚本文档中查找未知字符串并将其更改为大写

    我写在Fountain markdown http fountain io http fountain io 在谷歌文档中 喷泉是用来写剧本的 我想通过自动大写某些元素 打开或使用按钮等 使喷泉中的书写更加友好 这是一个格式正确的剧本 在喷
  • 哪个 django OpenID 库可与新的 Google OpenID 配合使用

    由于 Google 弃用了 OpenID 2 0https developers google com accounts docs OpenID2 https developers google com accounts docs Open
  • 如何使符号计算中的所有低值都变为零?

    如何将 SymPy 表达式中的所有低值设为零 例如我的结果是 1 0 a1 cos q1 6 12e 17 a2 sin q2 a3 sin q2 q3 a4 sin q2 q3 q4 sin q1 1 0 a2 cos q2 a3 cos
  • Python中计算二叉树的深度

    我是编程新手 正在尝试计算 Python 中二叉树的深度 我相信我的错误是因为深度是 Node 类的方法而不是常规函数 我正在尝试学习OOP并希望使用一种方法 这可能是一个新手错误 这是我的代码 class Node def init se
  • OpenCL 在线编译:从 cl::program 或 cl::kernel 获取程序集

    我正在使用 OpenCL 运行内核基准测试 我知道我可以使用 OpenCL 供应商提供的各种工具离线编译内核 即ioc64 or poclcc 问题是我得到的性能结果无法用这些工具的汇编 OpenCL 运行时开销或类似的来解释 我想看到由我
  • 我无法删除 Azure AD 门户中的本机应用程序注册

    我只想删除出于测试目的而创建的 AD 应用程序注册 我无法删除它 因为删除按钮呈灰色 在我删除另一个未使用的应用程序之前没有任何问题 有什么建议么 游戏有点晚了 但是当尝试上述步骤时 它们对我不起作用 总是被禁用 并且由于某种原因 我无法将
  • 整个计算机处于 Git 状态未跟踪文件

    我是 git 新手 我想我不小心克隆到了根目录中 当我提交一个文件 index html 时 我注意到我的整个计算机 我的桌面 我的文档等 都在未跟踪的文件中 我删除了存储库 并且想删除所有未跟踪的文件 显然不想删除计 算机中的所有内容 我
  • 在 Safari 中打开 WebView 链接

    我正在 Cocoa 中开发一个应用程序 我想知道是否有一种方法 如何使我的 webview 中单击的任何链接在 Safari 或默认浏览器 中启动 提前致谢 我自己刚刚遇到了这个问题 并通过以下方式解决了它 我的主控制器对象被设置为 Web
  • 捕获 C++ 库崩溃的一致方法

    我浏览了不同的网站 除了那些似乎不起作用的网站之外 找不到这个问题的任何答案 正如标题所示 我正在尝试找到一种方法来捕获我正在处理的库是否崩溃 我有一个 Root 类 它保存我的库中的许多管理器样式类的实例 并在其析构函数中释放这些实例 当