2015-02-05 124 views
0

我開始學習C++中的異常主題。 我遇到了「堆棧展開」這個術語,這意味着,據我的理解, 每當引發異常,並且「throwing function」中沒有catch塊時,函數堆棧將「展開」,並且由此所有本地對象d'tor將被調用(並且在外部函數中也會發生相同的操作,直到遇到合適的catch塊)。堆棧展開異常C++

我的問題:

假設異常與合適的下一個捕捉try塊內拋出, 將D'TOR將呼籲try塊中定義的所有對象? 或在try塊中定義的所有對象,直到發生異常?或根本沒有任何對象,他們將「等待」該功能退出?

回答

2

語義是當控件離開塊(一個函數是一個帶參數是局部變量的命名塊)時,塊中聲明的任何局部變量應該被銷燬。所以當你離開一個try-block時,任何本地創建的變量將被銷燬,並且它的適當的dtor被調用。所有創建的東西都會被銷燬,如果沒有創建它,它就不能被銷燬。唯一沒有被銷燬的是objet本身的異常(當然)。

從C++規範:

15.2構造和析構1.作爲控制從那裏則拋出異常給 處理程序的點通過,析構函數被調用的所有自動對象構造 由於嘗試塊被輸入。自動對象在它們的結構

15.2的構造的完成和析構函數的相反順序3.要求自動對象析構函數的過程的路徑上構成 從try塊的點被破壞 其中一個異常被拋出 被稱爲「堆棧展開」。