簡體   English   中英

使用(未)捕獲的異常展開堆棧

[英]Stack unwinding with (un)caught exceptions

堆棧展開

在堆棧展開部分有以下兩段:-

一旦構造了異常 object,控制流向后工作(向上調用堆棧)直到到達 try 塊的開頭,此時所有關聯的 catch 塊的參數按照出現的順序與類型進行比較異常 object 以查找匹配項(有關此過程的詳細信息,請參見 try-catch)。 如果未找到匹配項,則控制流繼續展開堆棧,直到下一個 try 塊,依此類推。 如果找到匹配項,則控制流跳轉到匹配的 catch 塊。 隨着控制流在調用堆棧中向上移動,將為所有具有自動存儲持續時間且已構建但尚未銷毀的對象調用析構函數

然后我們有

如果拋出異常但未被捕獲,包括轉義 std::thread 的初始 function、主 function 以及任何 ZA81259CEF8E959C23:97ZD456E5 的構造函數或析構函數的異常,則 std:97ZD 或稱為 thread.local objects,則對於未捕獲的異常,是否發生任何堆棧展開是實現定義的。

現在我有點困惑,起初它說當我們向上移動堆棧尋找匹配捕獲的嘗試時,調用析構函數,然后它說如果未捕獲異常,則不保證調用析構函數。 它是哪一個? 運行時是否會跟蹤可能被調用的析構函數,直到它最終找到匹配的捕獲,然后才以相反的構造順序調用它們? 此外,在 catch 執行之前是否調用了析構函數?

您似乎認為搜索匹配的catch()時調用了析構函數。 不一定是這樣。

從程序中的當前位置到匹配的catch()的析構函數最終會被調用,但這並不需要在找到 catch 之前開始發生。

第二個塊只是聲明沒有找到任何捕獲,然后程序一旦做出決定就可以立即終止。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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