2014-09-04 73 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?

你可以嘗試終止信號處理程序中的一個有問題的線程,並設置一個全局標誌來說「我們被搞砸了,關閉的時間。然後在你的主要消息循環中,檢查該標誌,如果已設置,則發出。

相關問題