0

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

4

3 回答 3

1

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

于 2013-04-03T21:35:47.990 回答
0

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

于 2013-04-03T21:58:08.973 回答
0

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

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

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

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

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

另外在 §18.8.3.4 P1 中:

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

C++11 还定义了std::quick_exit(int status)可以以类似方式使用的函数(大概没有核心转储)。此功能可从<cstdlib>.

于 2013-04-04T01:32:20.577 回答