我正在开发一个 C++ 应用程序,该应用程序使用另一个团队用 C 编写的库。图书馆的作者喜欢打电话exit()
当发生错误时,立即结束程序,而不调用 C++ 应用程序中堆栈上对象的析构函数。应用程序设置了一些系统资源,这些资源在进程结束后不会自动被操作系统回收(共享内存区域、进程间互斥体等),因此这是一个问题。
我拥有应用程序和库的完整源代码,但该库非常完善并且没有单元测试,因此更改它将是一件大事。有没有办法“挂钩”电话exit()
这样我就可以为我的应用程序实现正常关闭?
我正在考虑的一种可能性是开设一门大课is应用程序 - 意味着所有清理都将在其析构函数或其成员之一的析构函数中进行 - 然后在堆上分配这些大对象之一main()
,设置一个全局指针指向它,并使用atexit()
注册一个处理程序,该处理程序只需通过全局指针删除对象。这可能有效吗?
有没有已知的好方法来解决这个问题?
在最坏的情况下,您始终可以编写自己的实现exit
并链接它而不是系统自己的实现。您可以在那里处理错误,并且可以选择调用_exit(2) http://linux.die.net/man/2/_exit你自己。
既然你有库源,那就更简单了 - 只需添加一个-Dexit=myExit
构建时标记,然后提供一个实现myExit
.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)