在信号处理程序中显式调用析构函数

Dan*_*ook 3 c++ destructor signals

我有一个析构函数执行一些必要的清理(它杀死进程).即使将SIGINT发送到程序,它也需要运行.我的代码目前看起来像:

typedef boost::shared_ptr<PidManager> PidManagerPtr
void PidManager::handler(int sig)
{
  std::cout << "Caught SIGINT\n";
  instance_.~PidManagerPtr();  //PidManager is a singleton
  exit(1);
}
//handler registered in the PidManager constructor
Run Code Online (Sandbox Code Playgroud)

这有效,但似乎有很多警告反对显式调用析构函数.在这种情况下这是正确的做法,还是有"更正确"的方法呢?

GMa*_*ckG 5

如果该对象是单例,则不需要使用共享指针.(只有一个!)

如果你把它切换到auto_ptr你可以打电话release().或许scoped_ptr,打电话reset().

这一切都说,我99%肯定exit()会破坏静态构造的对象.(这些单身人士往往是.)我所知道的是exit()调用注册atexit()函数.

如果您的单身人士没有通过退出自动销毁,那么在您的情况下要做的就是做一个atexit钩子:

void release_singleton(void)
{
    //instance_.release();
    instance_.reset();
}

// in main, probably
atexit(release_singleton);
Run Code Online (Sandbox Code Playgroud)