2017-02-17 67 views
1

我正在使用std :: unique_ptr來管理某些內存。當我的進程正常退出時,這可以正常工作,因爲我可以看到正在調用的相關構造函數和析構函數。但是,當使用SIGTERM處理進程時,我看不到被調用的析構函數。當進程通過信號終止時,std :: unique_ptr的這種預期行爲是什麼?有什麼辦法可以解決這個問題嗎?提前致謝!智能指針在進程死亡時的行爲

+0

可能的重複https://stackoverflow.com/questions/4250013/is-destructor-called-if-sigint-or-sigstp-issued –

+0

也相關https://stackoverflow.com/questions/9033931/memory-leak -c/9034141 –

+1

雖然user268396的回答是正確的,但您應該意識到正確編寫信號處理程序非常困難。例如,從信號處理程序中訪問大多數全局變量是非法的。如果你想知道如何做到這一點,我建議發佈一個新的問題。 – Brian

回答

2

這是可以預料的:默認的信號處理程序將在您的進程中有效地調用exit(),這將終止進程。爲了解決這個問題,你應該安裝一個信號處理器,並在接收信號時採取適當的行動。

+0

我正在使用signal_handler來捕獲信號並在同一個內部調用exit(0)。不應該導致unique_ptr爲其存儲的指針調用析構函數嗎? – wishywashy

+1

@wishywashy:請參閱[std :: exit](http://en.cppreference.com/w/cpp/utility/program/exit),特別是:*「堆棧未解開:自動存儲的變量析構函數持續時間](http://en.cppreference.com/w/cpp/language/storage_duration)不會被調用。「* – IInspectable

+1

程序在被致命信號終止後的行爲更接近調用'_exit'而不是'exit '。它不**運行'atexit'處理程序。 – Brian