【问题标题】:Destructor not being called as expected未按预期调用析构函数
【发布时间】:2015-02-26 05:10:41
【问题描述】:

我正在编写一个服务器应用程序。在 RIIA 之后,在我的一个类的构造函数中创建一个文件,并在析构函数中删除它。这个类被包裹在一个 unique_ptr 中。这是一个服务器应用程序,我只能通过向它发送信号 (SIGINT) 来杀死它。

奇怪的是,我在 unique_ptr 持有的类的析构函数上放置了 std::cerr 语句,并且在应用程序关闭/终止时不会调用它们。

当按下 ctrl+c 时这是预期的,还是我遗漏了与析构函数相关的明显内容?

【问题讨论】:

  • RIIA -> RAII(资源获取即初始化)
  • 当你按下Ctrl-C时,你认为你的程序的控制流程是什么?
  • @BryanChen - 这是一个从 POCO 框架的 ServerApplication 实例调用的普通类。实际上,根本没有多少代码。
  • @KerrekSB - 我不知道。我猜操作系统会向进程发送信号并杀死它。

标签: c++ unix c++11


【解决方案1】:

信号处理和 C++ 异常是不同的特性。信号(主要是 *nix 特性)被信号处理程序捕获;我相信虽然在某种意义上肯定“范围”发生了变化,但它是从 C++ 运行时之外更改的,因此不会触发通常的堆栈展开(可以说,这就像在堆栈的第二维中移动) .谷歌搜索将我指向这篇我觉得有趣的帖子:https://gcc.gnu.org/ml/gcc-help/2011-08/msg00253.html

【讨论】:

  • 发送信号确实会引发异常。我想我需要捕捉信号并在发生这种情况时进行清理。
  • 是的,你需要让守护进程优雅地退出,而不仅仅是中止。
猜你喜欢
  • 2012-10-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-30
  • 1970-01-01
  • 2018-03-21
  • 2019-05-23
  • 2018-02-03
相关资源
最近更新 更多