【问题标题】:callback to be called before any objects with automatic storage duration are destroyed在销毁具有自动存储持续时间的任何对象之前调用的回调
【发布时间】:2016-05-05 20:26:26
【问题描述】:

是否存在注册回调的标准(任何 C++ 标准)方法,该方法在任何具有自动存储持续时间的对象作为正常程序终止的一部分被销毁之前不久被调用?

编辑:

为了更清楚地说明这一点。这是一个多线程应用程序。某些对象可能已将仿函数推入线程池,该线程池引用它们(仿函数访问“发起者”对象)。线程池对象是静态的,所以它会在main() 返回之后被销毁,因此在所有这些将仿函数推入线程池并引用它们的对象已经被销毁之后。线程池在终止时被刷新,因此函子中有对“发起者”对象的悬空引用。

【问题讨论】:

  • 析构函数呢?
  • 是的,但是每个类都有自己的,都必须安装一个钩子机制。更不用说非类类型的对象了。
  • 您想要在程序终止前进行一次回调,还是在每次对象被销毁时进行一次回调?
  • 一个回调,就在 main() 返回之前,但我不必摆弄 main()。比如,把 SCOPE_EXIT(&, exit_callback());进入 main()。
  • 在main的底部添加一个函数?

标签: c++


【解决方案1】:

std::atexit 应该做你想做的事:

注册 func 指向的函数,以便在正常程序终止时调用(通过 std::exit() 或从 cpp/language/main 函数返回)

http://en.cppreference.com/w/cpp/utility/program/atexit'

您可能还想在 std::terminate_handler 上放一些东西。

http://en.cppreference.com/w/cpp/error/terminate_handler

【讨论】:

  • 不不,到那时,一些对象已经被销毁了。在 main() 中分配的那些。
  • main 并不特殊——函数中的所有自动变量都会在函数结束时被清除。如果您想在任意函数结束时运行某些东西,您可以轻松地制作自己的。清理 main 中的变量不是程序终止的一部分。唯一“难”的事情是处理静态变量之类的事情——这就是解决这些问题的方法。
  • @user1095108,如果显式调用exit(),自动变量不会被销毁。
猜你喜欢
  • 1970-01-01
  • 2012-11-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-04-01
  • 1970-01-01
  • 2014-09-24
  • 2011-12-07
相关资源
最近更新 更多