2017-02-17 66 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