2014-09-04 75 views
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只是释放它(为了调用析构函数),但涉及一些额外的工作。

并且还,也可能是一个全局对象,但我想避免全球初始化顺序问题...

+1

当您收到分段错误时,您无法从程序内部判断出了什么问题,因此您不能说出解决该问题的方法。而且实际上你不需要做任何事情,因为所有现代多任务操作系统都会释放并释放程序退出时分配的所有资源。 – 2014-09-04 11:42:20

+3

@JoachimPileborg:你是对的,操作系统将释放内存,文件句柄,网络连接和其他一些资源。但它不会释放一切,例如临时文件,POSIX消息队列,我相信人们拥有的许多“遗留”资源不是,我们应该说,“面向连接”。这是一个很久以前我问过的关于这种情况的流行问题:http://stackoverflow.com/questions/471344/guaranteed-file-deletion-upon-program-termination-cc – 2014-09-04 11:46:56

+0

@fritzone:就像你的应用程序服务器一样,一个中心事件循环会不断循环?或者它更像是一个程序性的一次性应用程序? – 2014-09-04 11:47:56

回答

1

你可以尝试编排上SIGSEGV有序关闭。它不是没有缺陷,但从这里开始:Is it possible to terminate only the one thread on receiving a SIGSEGV?

你可以尝试终止信号处理程序中的一个有问题的线程,并设置一个全局标志来说“我们被搞砸了,关闭的时间。然后在你的主要消息循环中,检查该标志,如果已设置,则发出。

相关问题