2013-04-03 46 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>獲得。

相關問題