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

byt*_*uff 11 c++ legacy-code

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

我有应用程序和库的完整源代码,但是库已经非常完善,并且没有单元测试,因此更改它将是一个大问题.有没有办法"挂钩"调用,exit()以便我可以为我的应用程序实现正常关闭?

我正在考虑的一种可能性是创建一个大类,应用程序 - 意味着所有清理都会在其析构函数或其成员之一的析构函数中发生 - 然后在堆中分配其中一个大对象main(),设置全局指向它的指针,并atexit()用于注册一个只通过全局指针删除对象的处理程序.那可能有用吗?

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

Car*_*rum 14

在最糟糕的情况下,您始终可以编写自己的实现exit并链接它而不是系统自己的实现.您可以在那里处理错误,并可选择自行调用_exit(2).

由于您拥有库源,因此更容易 - 只需-Dexit=myExit在构建时添加标志,然后提供实现myExit.


bob*_*bah 5

使用atexit安装退出处理程序并实现所需的行为