boost::shared_pointer 退出而不调用 release

Posted

技术标签:

【中文标题】boost::shared_pointer 退出而不调用 release【英文标题】:boost::shared_pointer exit without calling release 【发布时间】:2013-04-03 21:33:26 【问题描述】:

我正在使用一个程序,其中我的代码调用第三方库,该库使用 boost 和 shared_pointers 创建一个庞大而复杂的结构。这个结构是在我调用的方法中创建的,在方法结束时我知道程序已经完成。 对于我正在处理处理代码的大型示例,处理处理需要 30 分钟,而在退出时自动调用的 boost 代码需要很多小时。退出程序而不释放内存并花费所有时间将是一个完全可以接受的结果。 我试过 向量 *iddListV = 新向量(); // 这会泄漏内存 将所有相关结构添加到向量中,但这无济于事。 我也尝试调用 exit(0);在到达子程序结束之前。这也导致 boost 代码花费大量时间来尝试释放指针。 如何在不调用 boost 析构函数的情况下让 C++ 程序(Windows 上的 Microsoft C++)突然退出。 我的限制是我可以在分配 boost 结构之前调用任何函数,但一旦开始运行就不能修改代码。

【问题讨论】:

我使用的是 C++11 版本,但是 boost 是否允许您提供自定义删除器? @chris 是的,有boost doc 很好奇,您是否尝试过分析以了解为什么会出现问题? 在调试器中运行在代码完成后暂停程序并退出函数总是在某个级别的 boost 析构函数处停止。 【参考方案1】:

_Exit 退出而不调用任何析构函数。

【讨论】:

【参考方案2】:

如果您不关心可移植性,可以致电TerminateProcess()。但请记住,您绝对确定您的程序处于准备终止的状态。例如,如果您在 I/O 有机会刷新之前终止,那么您的文件数据和网络流可能会变得无效。

【讨论】:

【参考方案3】:

可以以便携的方式执行以下操作:

#include <exception>
...
std::terminate();

但是,有一个很大的问题,至少在 linux 上,这可能会导致核心转储。 (我真的不确定 Windows 上的行为是什么)。

应该注意,行为是根据是否调用析构函数来定义的。选址§15.5.1 P2:

在搜索处理程序 (15.3) 遇到 具有 noexcept 规范的函数的最外层块 不允许异常(15.4),是否由实现定义 堆栈之前已展开、部分展开或根本未展开 std::terminate() 被调用。

另外在 §18.8.3.4 P1 中:

备注:当必须处理异常时由实现调用 由于多种原因(15.5.1)中的任何一个而被放弃,立即生效 在评估 throw-expression (18.8.3.1) 之后。也可以称为 直接通过程序。

C++11 还定义了函数std::quick_exit(int status),可以以类似的方式使用(可能没有核心转储)。此功能可从&lt;cstdlib&gt;获得。

【讨论】:

以上是关于boost::shared_pointer 退出而不调用 release的主要内容,如果未能解决你的问题,请参考以下文章

为啥这个 for 循环在某些平台上退出而不在其他平台上退出?

退出活动而不关闭对话框

SBT 停止运行而不退出

退出管道工作而不会失败

iOS:当应用程序因任何崩溃而退出时,是不是有任何委托方法

收到 applicationDidEnterBackground 时退出应用程序而不是进入后台