离开c ++应用程序而不运行全局静态对象的析构函数

Fer*_*eak 3 c c++ exit

我已经"继承"了一个设计,我们在应用程序退出时使用一些全局对象来处理事务(更新应用程序状态日志文件等等......对问题不重要).

基本上,应用程序创建特定类的虚拟辅助对象,并允许它们的析构函数在应用程序正常退出或遇到错误时执行这些额外的工作(并且应用程序知道在所有情况下要做什么,再次与问题无关) .

但是现在我遇到了一种我不想调用这些析构函数的情况,只需离开应用程序而不执行这些"终止作业".我怎样才能以体面的,独立于平台的方式做到这一点?我不想要像零除的解决方案:)

编辑:我知道设计已经破了:)我们正在努力修复它.

编辑2:我想避免任何异常退出的"痕迹"...对于迟到的规范抱歉.

编辑3:获取对析构函数的源代码的访问权限以便修改它们非常困难.当政治家接管键盘并尝试编写程序时就会发生这种情况.我们只知道,"他们的"析构函数将在退出时运行...

tom*_*myk 5

abort();
Run Code Online (Sandbox Code Playgroud)

中止当前进程,产生异常程序终止.

该函数引发SIGABRT信号(就像调用raise(SIGABRT)一样).如果未加载,则会导致程序终止将与平台相关的不成功终止错误代码返回给主机环境.

程序终止时不会破坏任何对象,也不会调用传递给atexit或at_quick_exit的任何函数.


Joh*_*ing 5

我怎样才能以体面的,独立于平台的方式做到这一点?

你不能.至少不是一个体面的方式.

您可以通过throw异常而不是异常来实现此catch目的.最终结果是您的应用程序将非常不合适地终止.不会调用析构函数.这是非常丑陋,非常hackish.如果你的设计依赖于这种行为来正常运行,那么你的设计不仅完全痴呆,而且几乎不可能维护.

我宁愿在你不想运行析构函数的对象中设置一个布尔标志.如果设置了此标志,则不会运行销毁代码.析构函数仍将触发,但可以跳过要避免运行的实际代码.


如果您控制全局的构造,您可能能够利用运算符placement-new.构建一个char足够全球的全局缓冲区,然后构建全局缓冲区placement-new.由于必须通过显式调用析构函数来销毁以这种方式构造的对象,因此不要在关闭时调用析构函数来实现全局.