2013-04-03 62 views
0

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

+0

我使用的是C++ 11的版本,但是确实可以让你提供一个定制的删除器吗? – chris 2013-04-03 21:34:47

+0

@chris是的,有[助推文档](http://www.boost.org/doc/libs/1_53_0/libs/smart_ptr/shared_ptr。htm#deleter_constructor) – helloworld922 2013-04-03 21:42:35

+0

好奇,你有没有尝试分析,看看为什么有一个问题? – 2013-04-03 23:15:35

回答

1

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

0

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

0

这是可能的,可移植的方式,要做到:

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

然而,有一个大的疑难杂症,在那,至少在Linux上,这可能会导致核心转储。 (我真的不确定Windows上的行为是什么)。

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

在用于一个处理器(15.3)的搜索中遇到的函数的最外 块以noexcept规格,它 不允许异常(15.4)的情况下,它是 std :: terminate()被调用之前,是否实现定义是否 堆栈解开,部分展开,或者根本没有展开。

此外,在§18.8.3.4P1:

备注:由实现调用时的异常处理必须 放弃了任何的几个原因(15.5.1),立即生效 后评估投掷表达式(18.8.3.1)。也可以直接由程序调用 。

C++ 11还定义了函数std::quick_exit(int status),它可以类似的方式使用(可能没有coredump)。该功能可从<cstdlib>获得。