0
我想知道在应用程序刚刚崩溃(或被中断或其他)后是否有破坏在main()
中创建的对象的任何微不足道的方法。代码:如何销毁在SIGSEGV之后在main()中创建的对象
#include <iostream>
#include <signal.h>
#include <stdlib.h>
class TestClass {
public:
TestClass() { std::cerr << "Constructor" << std::endl; }
~TestClass() { std::cerr << "Destructor" << std::endl; }
};
void signal_handler(int signum) {
std::cerr << "Signal caught " << signum << std::endl;
exit(1);
}
int main() {
TestClass a;
struct sigaction new_action, old_action;
new_action.sa_handler = signal_handler;
sigemptyset (&new_action.sa_mask);
new_action.sa_flags = 0;
sigaction (SIGSEGV, NULL, &old_action);
if (old_action.sa_handler != SIG_IGN)
{
sigaction (SIGSEGV, &new_action, NULL);
}
// CRASH !!!
int* p = 0; *p = 0;
}
所以,我安装一个信号处理程序,在执行时应该做一些清理,只是退出之后很显然,这是一个很大的应用程序,所以我想打电话给我的类的析构函数。 (理论上讲)
这将很容易动态分配它,并在signal_handler
只是释放它(为了调用析构函数),但涉及一些额外的工作。
并且还,也可能是一个全局对象,但我想避免全球初始化顺序问题...
当您收到分段错误时,您无法从程序内部判断出了什么问题,因此您不能说出解决该问题的方法。而且实际上你不需要做任何事情,因为所有现代多任务操作系统都会释放并释放程序退出时分配的所有资源。 – 2014-09-04 11:42:20
@JoachimPileborg:你是对的,操作系统将释放内存,文件句柄,网络连接和其他一些资源。但它不会释放一切,例如临时文件,POSIX消息队列,我相信人们拥有的许多“遗留”资源不是,我们应该说,“面向连接”。这是一个很久以前我问过的关于这种情况的流行问题:http://stackoverflow.com/questions/471344/guaranteed-file-deletion-upon-program-termination-cc – 2014-09-04 11:46:56
@fritzone:就像你的应用程序服务器一样,一个中心事件循环会不断循环?或者它更像是一个程序性的一次性应用程序? – 2014-09-04 11:47:56