【发布时间】:2017-06-14 09:25:41
【问题描述】:
我有一个析构函数,即使程序被不正确地终止,也需要调用它以确保外部进程终止。
目前我已经注册了要被调用的析构函数
std::atexit(killprocess);
std::at_quick_exit(killprocess);
然而,这意味着当程序完成但未终止时,进程不会被终止。有什么方法可以确保在退出时或程序完成但未终止时调用 killprocess 或析构函数?
编辑:已完成但未终止的状态来自 Visual Studio,它在末尾添加了一个等待条件。我相信这意味着使用 atexit 注册了 killprocess 进程析构函数不会在执行中自然调用
【问题讨论】:
-
“已完成但未终止”是什么意思?您是指
main返回和进程实际结束之间的时间吗? -
在main的最后一行调用killprocess
-
在 POSIX 系统(如 Linux 和 macOS)上,您可以捕获某些用于异常终止的signals。 但是 一些“异常终止”可能是由于您想用
killprocess清理的东西而导致的崩溃,这反过来可能意味着killprocess可能不起作用。如果你有一个崩溃,就让它发生。捕获SIGQUIT、SIGTERM、SIGINT和SIGHUP信号,并调用exit,它将调用已安装的退出处理程序。 -
您的意思是 Visual Studio 在已终止的控制台应用程序窗口中放置的“按任意键...”文本吗?那么你的程序已经终止并且不再运行了。如果程序正常退出,那么您的退出处理程序和全局和静态对象的析构函数将已经运行。程序终止和 Visual Studio 等待您按键之间的这种状态全部由 Visual Studio 处理。
-
你的析构函数是什么?调用 exit() 告诉内核(UNIX、Linux 或 Windows)取消分配所有进程内存。不需要清理任何东西,它只会停止退出。例如,当您必须在崩溃时删除文件时,然后编写另一个进程来启动您的应用程序,保护它,并在崩溃的情况下执行您的特殊操作(异常程序退出)。
标签: c++ c++14 destructor atexit