為什麼C 中,析構函式 operator delete 以及operator delete 按照慣例不會丟擲異常?

時間 2021-06-01 16:00:14

1樓:ptore

相當於在異常處理機制下再拋乙個異常,這時候就只能無可避免的自動呼叫terminate來退出整個程式了,因為實在是幹不了這個活

2樓:

a. 因為資源必須被析構

b. 所以析構必須得成功

c. 因此析構必須無異常

想象一下,假如析構丟擲異常,那麼此例項是活是死?如何繼續完整析構?

3樓:

補充一點,以下可以偵測到stack unwind:

bool

uncaught_exception

()noexcept

;Returns true if an exception has been thrown but the initialization of the exception declaration in the matching handler (including an automatic call to unexpected or terminate) is not yet complete.

Returns false in all other cases, including when unexpected or terminate is explicitly called by the program.

Throwing another exception while this function returns true may result in the termination of the exception handling proccess (i.e., an automatic call to terminate).

以下設定terminate handler:

terminate_handler

set_terminate

(terminate_handlerf)

noexcept;

4樓:Alex Zhang

這個問題我也仔細研究過,但並沒有找到很權威的答案。effective c艹也提過,不應該在析構丟擲異常,我總結的原因是發生異常時,會自動呼叫區域性變數的析構函式,如果此時析構丟擲異常,就會有兩個未處理的異常存在,標準規定此時程式應當終止(存疑,沒去核查標準),我想是為了編譯器好處理,否則又要制定規則兩個異常同時存在時的先後處理,catch規則等…

5樓:

可以拋,但出錯的話,你的程式會直接terminate. 這可能不是你想要的。至少得寫個 log 之類的吧。

析構函式被呼叫的乙個情況是在已經發生exception正在 unwind stack時。unwind stack會呼叫stack中物件的析構函式。這個時候如果再出現異常,如果你是 C++,你說你怎麼辦?

你只能中斷 unwind stack 直接退出。程式中的其他邏輯,比如寫log,將不會被執行。好像沒有更好更合適的解決辦法。

C 析構函式問題?

zx718 我的理解是這樣,析構函式並不會真正改變成員變數所在記憶體的值,而是這一連續記憶體空間,你無法通過你的程式訪問到。你仍然可以輸出類內的成員變數是因為析構和輸出之間間隔很短,這一連續記憶體並沒有被其他程式破壞,所以還可以輸出還是原來的值。 邱昊宇 銷毀 destroy 析構 destruct...

為什麼C 中在析構函式中使用delete p和在普通函式中用產生不一樣的結果?

shzy delete指標後立馬賦值nullptr,並不 總 是乙個好習慣。他可能會掩蓋一些錯誤並使你的程式看似良好的繼續執行。因為delete nullptr在c 標準中有明確的定義。C 盡量總在析構裡delete,用raii管理資源。如果你偶然想嘗試delete後置空,八成是因為你無法確定指標接...

c 中,delete是如何呼叫虛析構函式的?

Pluto Hades 正常情況下,基類的構造和析構是不會被派生類覆蓋的。這也很好記,因為它們不同名嘛 正常new派生類指標,會先呼叫基類構造再呼叫派生類構造。正常delete派生類指標,和構造相反,先呼叫派生類析構,再呼叫基類析構。 Bunny.Lann 虛成員函式和虛析構函式肯定都是呼叫D的,只...