[英]How to destroy object created in main() after SIGSEGV
我想知道在應用程序剛剛崩潰(或被中斷,或其他原因main()
之后,是否有任何簡單的方法可以銷毀在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
釋放它(以調用析構函數),但這會涉及一些額外的工作。
而且,它可能是一個全局對象,但我想避免全局初始化順序問題...
您可以嘗試安排SIGSEGV的有序關閉。 這不是沒有陷阱,而是從這里開始: 收到SIGSEGV時是否可以僅終止一個線程?
您可以嘗試在信號處理程序中終止一個有問題的線程,並設置一個全局標志以表示“我們被搞砸了,該關閉了。” 然后在您的主消息循環中,檢查該標志並中斷該標志是否已設置。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.