【问题标题】:C++ detect program ending in destructorC ++检测以析构函数结尾的程序
【发布时间】:2020-11-09 16:36:25
【问题描述】:

我还没有找到这个问题的答案,但我几乎 100% 确定在某个地方已经布置好了。

我有一个普通的 C++ 类,并且我使用的是第 3 方日志记录系统。 不幸的是,我有 2 个要求和 3 个事实是我无法匹配的:

要求:

  1. 在析构函数中记录一些东西
  2. 处理程序终止干净(不崩溃)

事实:

  1. 第 3 方日志记录系统在程序终止时崩溃,因为它调用了 pthread_mutex_lock
  2. 我不想更改此日志记录系统
  3. 我也不想深入研究它

代码如下:

class myClass {
public:
  myClass() {}
  ~myClass() {
    LOG << "Destructor called!";
  }
};

int main() {
  myClass c;
  sleep(1);
  return 0;
}

当程序完成时,由于LOG 命令存在分段错误(即:如果我删除它,则没有分段错误)。

在正常情况下,我需要这个日志函数来显示myClass 何时被破坏,所以这里有一个直截了当的问题:

如果程序终止(或其他原因是破坏的原因),我能否在类 (myClass) 的析构函数中检测到?

【问题讨论】:

  • 你的main()函数不应该返回一些东西吗?
  • @vahancho 不,main() 是特殊的,如果控制到达此函数的末尾,编译器将隐式添加return 0;
  • @vahancho 它在the standard
  • @vahancho From C++17 draft 6.6.1: "5. main 中的 return 语句具有离开 main 函数(销毁任何具有自动存储持续时间的对象)并调用 std::exit 的效果返回值作为参数。如果控制从 main 的复合语句的末尾流出,则效果等同于操作数为 0 的返回(另见 18.3)。"
  • 可能与static initialization fiasco有关。

标签: c++ destructor terminate


【解决方案1】:

如果程序正在终止,我能否在类 (myClass) 的析构函数中检测到

是的,如果实例具有静态存储。您可以使用std::atexit 注册将在销毁静态对象期间执行的函数。此函数可用于设置命名空间范围变量,该变量表示程序是否正在退出。您的类的析构函数可以检查该变量的状态。

您必须确保在调用std::atexit 之前创建其析构函数依赖于该变量的实例。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-30
    • 1970-01-01
    • 1970-01-01
    • 2014-05-09
    • 2023-03-15
    • 1970-01-01
    相关资源
    最近更新 更多