簡體   English   中英

SIGSEGV之后如何銷毀main()中創建的對象

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM