2011-12-31 175 views
1

我想刪除一個已經刪除的對象,我得到一個SIGABRT信號。 我知道這個信號中止我的程序,但我想在信號處理程序中捕獲此信號,並顯示消息,我正在刪除一個已刪除的對象...如何編寫sigabrt信號的信號處理程序?

這是我試過的代碼,但它doesn似乎沒有用。 請幫我弄清楚它有什麼問題嗎?

using namespace std; 

class myclass 
{ 
public: 
    myclass() { cout <<"myclass constructed\n"; } 
    ~myclass() { cout <<"myclass destroyed\n"; } 
}; 

void func(int); 

int main (void) 
{ 
    signal(SIGABRT,func); 
    myclass * pt; 

    pt = new myclass[3]; 

    delete[] pt; 
    delete[] pt; 

    return 0; 
} 

void func(int) 
{ 
    signal(SIGABRT,func); 
    cout << "trying to delete unallocated memory, exiting....\n"; 
    exit(0); 
} 
+0

你是什麼意思「似乎沒有工作」? (在這裏工作正常,請嘗試格式化你的代碼) – Mat 2011-12-31 20:14:00

+0

它只是中止沒有給我的味精「試圖刪除未分配的內存,退出......」 – haris 2011-12-31 20:15:55

+0

我看到消息打印罰款(克++ 4.6.1/ubuntu 11 x86)如果這是你如何定義「作品」。 – hmjd 2011-12-31 20:17:37

回答

2

C標準說(部分7.14,兩者C99C11的第4段):

的實現不需要生成任何這些信號的,除非顯式 呼叫到的結果提升功能。

C++標準沒有給出額外的附加保證。

POSIX說:

中止()函數將導致出現不正常的進程終止,除非信號SIGABRT被捕獲,並且信號處理函數沒有返回。

異常終止處理應包括爲SIGABRT定義的默認操作,並可能包括嘗試在所有打開的流上生效fclose()。

SIGABRT信號應該發送到調用進程,就像通過提高()一樣使用參數SIGABRT。

提供給狀態等待()或waitpid函數()由中止()應是由SIGABRT信號終止的進程的。 中止()函數應覆蓋阻塞或忽略SIGABRT信號。

所以,是的,你有希望看到一個SIGABRT完全沒有依據;你很幸運,你沒有遇到nasal demons