如何处理第三方库代码中的 exit() 调用?

2024-03-16

我正在开发一个 C++ 应用程序,该应用程序使用另一个团队用 C 编写的库。图书馆的作者喜欢打电话exit()当发生错误时,立即结束程序,而不调用 C++ 应用程序中堆栈上对象的析构函数。应用程序设置了一些系统资源,这些资源在进程结束后不会自动被操作系统回收(共享内存区域、进程间互斥体等),因此这是一个问题。

我拥有应用程序和库的完整源代码,但该库非常完善并且没有单元测试,因此更改它将是一件大事。有没有办法“挂钩”电话exit()这样我就可以为我的应用程序实现正常关闭?

我正在考虑的一种可能性是开设一门大课is应用程序 - 意味着所有清理都将在其析构函数或其成员之一的析构函数中进行 - 然后在堆上分配这些大对象之一main(),设置一个全局指针指向它,并使用atexit()注册一个处理程序,该处理程序只需通过全局指针删除对象。这可能有效吗?

有没有已知的好方法来解决这个问题?


在最坏的情况下,您始终可以编写自己的实现exit并链接它而不是系统自己的实现。您可以在那里处理错误,并且可以选择调用_exit(2) http://linux.die.net/man/2/_exit你自己。

既然你有库源,那就更简单了 - 只需添加一个-Dexit=myExit构建时标记,然后提供一个实现myExit.

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

如何处理第三方库代码中的 exit() 调用? 的相关文章

随机推荐

  • 如何在 MVC4 中将对象添加到缓存并从缓存中访问数据?

    大家好 我有一个返回这样的数据的对象 var productdetial productId 1 productname Casualshirts productSkus Skuimage URL
  • Stripe 帐户功能已设置但仍引发错误

    我确实使用以下参数创建了 Stripe 帐户 stripe accounts create type custom business type individual individual email user email first nam
  • 用百分比将小部件放置在堆栈中

    假设我想将一个小部件放置在Stack但使用堆栈位置的百分比而不是固定大小 如何在颤振中做到这一点 我希望Positionned fromRelativeRect构造函数就是这样 使用 0 到 1 之间的浮点数 但似乎不是 Align允许以百
  • 库的 Makefile

    每次我想使用库执行程序时 我都必须在终端上运行这 4 个命令 这些线是 cc m32 c mylib c ar rcs libmylib a mylib o cc m32 c prog c cc m32 prog o L lmylib a
  • 如何用html css实现杂乱的气泡布局?

    我需要有一个像这样的气泡布局 我已经完成了这个阶段的工作 JsBin http jsbin com huyasi 6 由于我对CSS Web设计不太熟练 所以我只能想到使用table tr td 但我可以看到我需要将气泡彼此靠近对齐 如果我
  • 在 CDT 项目中使用不同的 C++ 编译器的正确方法是什么?

    我在 Linux 上使用 Eclipse CDT Mars 2 和 Neon RC 我的发行版的默认 C 编译器是 GCC 5 3 1 但对于我的一些工作 我使用 GCC 4 9 3 我想一切关于我使用 GCC 4 9 3 的项目 工具发现
  • 使用自定义封送拆收器时的 C# Marshal.Sizeof()

    是否可以使用Marshal SizeOf 在使用自定义封送拆收器的结构上 例如 struct Abcde public int test1 MarshalAs UnmanagedType CustomMarshaler MarshalTyp
  • 自定义类上的 List. except

    假设我有一个自定义类 public class WineCellar public string year public string wine public double nrbottles 假设我现在有这个自定义类的列表 List
  • 这些为单例创建静态实例的方法有什么区别?

    我最近遇到了一个错误 该错误仅在将库构建为发布版本而不是调试版本时才会显现出来 该库是一个带有 COM 包装器的 NET dll 我正在使用 CoCreateInstance 在非托管 C 应用程序中从 dll 创建一个类 当我最终找到该错
  • 在Python中,给定一个函数名,如何获取包含该函数的所有模块?

    例如 有os path walk os walk并假设另一个md walk 并假设os是进口的但是md不是 我想要一个像 whereis walk 虽然可以返回os path walk os walk and md walk 或者如果很难知
  • IE9 + IE10 中文本输入的文本垂直居中

    这里的例子 http jsfiddle net D7v2Y http jsfiddle net D7v2Y 在 firefox webkit 中这效果很好 文本居中 不适用于 IE10 或 IE9 input display block b
  • 遍历 Linq 表达式以设置属性字段的值

    这是一个非常复杂的问题 尽管看起来很简单 我想我必须遍历整个表达式树 除非有人知道更好的方法 假设我有一个用户对象 class User public UserAccount Account get set class UserAccoun
  • Data Mapper 是比 Active Record 更现代的趋势吗

    我遇到过几个 ORM 它们最近宣布计划将其实现从 Active Record 迁移到 Data Mapper 我对这个主题的了解非常有限 那么对于那些更了解的人来说一个问题是 Data Mapper 比 Active Record 更新吗
  • 使用 Jekyll 的 Github 页面推送网站后出现空白页面

    我使用 Jekyll 创建了一个 GitHub Pages 网站 浏览时一切正常http 本地主机 4000 http localhost 4000 然后我push到github上 但是访问的时候什么也没有 空白页 没有错误 没有内容 ht
  • 如何检测在asp.net (mvc) 中单击了哪个提交按钮

    我已经阅读了大量使用提交类型输入值的答案 但我的输入按钮集合需要全部具有相同的文本 其他人使用 Javascript 我也试图避免这种情况
  • CreateView 中的 DatepickerWidget

    在我的模型中 我有一个日期字段 所以我想使用日期选择器 如何使用 Django Admin 日期选择器 我找到了在表单中执行此操作的示例 但我只设计了一个模型 是否可以在我的模型中定义这个小部件 您可以使用get form覆盖小部件属性的方
  • Twilio javascript 客户端回调呼叫应答

    我正在使用 Twilio JavaScript 客户端 我能够拨打电话 捕获回调事件 连接和断开连接 如何实现接听电话时的回调 我需要在接听电话后显示通话计时器 Twilio js 客户端有一个 Device 属性 其中包含您可以使用的以下
  • 如何运行 git log 以仅查看特定分支的更改?

    我有一个本地分支跟踪远程 主分支 运行后git pull and git log 日志将显示远程跟踪分支以及当前分支中的所有提交 但是 由于对远程分支进行了如此多的更改 因此我只需要查看对当前本地分支所做的提交 用于仅显示特定分支的提交的
  • 特金特;新班级中的顶级

    我正在使用 Python 和 Tkinter 开发一个项目 我想将其模块化 主要问题之一是我的实施Toplevel小部件太大 我听说可以将此小部件放入一个新类中 问题是我不知道怎么办 这是我定义主窗口的方式 class App tk Tk
  • 如何处理第三方库代码中的 exit() 调用?

    我正在开发一个 C 应用程序 该应用程序使用另一个团队用 C 编写的库 图书馆的作者喜欢打电话exit 当发生错误时 立即结束程序 而不调用 C 应用程序中堆栈上对象的析构函数 应用程序设置了一些系统资源 这些资源在进程结束后不会自动被操作