2010-02-09 32 views
0

在VC++ 7,如果我做了以下內容:是否允許null terminate()處理程序?

void myTerminate() 
{ 
    cout << "In myTerminate()"; 
    abort(); 
} 

int main(int, char**) 
{ 
    set_terminate(&myTerminate); 
    set_terminate(0); 
    terminate(); 
    return 0; 
} 

程序的行爲完全一樣,如果abort()直接叫是默認terminate()處理程序做什麼。

如果我省略set_terminate(0);語句,我正在調用終止處理程序。因此調用set_terminate(0)似乎會將terminate()處理程序重置爲默認值。

此行爲僅適用於VC++ 7嗎?如果我在某些其他實現上調用set_terminate(0),程序是否會遇到未定義的行爲?

回答

4

展望標準揭示了以下內容:

terminate_handler set_terminate(terminate_handler f) throw(); 

作用:建立用F指定爲當前處理 函數的函數 ...切
要求:f不能是空指針
返回:上一個terminate_handler。

似乎是非標準的。

+1

Section 18.6.3.2 :) – Manuel 2010-02-09 11:31:45

+0

所以這是不明確的行爲,不是嗎? – sharptooth 2010-02-09 11:32:14

+0

是的,這是未定義的行爲。您需要存儲以前的處理程序並明確地恢復它。 – 2010-02-09 11:35:03

相關問題