首頁 >後端開發 >C++ >C 中「goto」是否繞過析構函式執行?

C 中「goto」是否繞過析構函式執行?

Linda Hamilton
Linda Hamilton原創
2024-12-01 04:52:14888瀏覽

Does `goto` Bypass Destructor Execution in C  ?

Goto 可以在不呼叫析構函數的情況下遍歷函數嗎?

一個常見的誤解是 goto 會跳過程式碼段,從而避免執行析構函數和類似函數運作。這種誤解在圍繞 C 的討論中尤其明顯。

範圍限制

與普遍看法相反,goto 無法遍歷函數邊界。嘗試跳到不同函數中定義的標籤會導致編譯器錯誤,如下所示:

錯誤:標籤「lol」已使用但未定義

對象初始化注意事項

同樣不允許跳過物件初始化。如果您嘗試跳過物件的初始化,編譯器將標記一個錯誤:

錯誤:跳到標籤'lol'
錯誤:從這裡
錯誤:交叉初始化'int x'

特定範圍的銷毀

物件具有自動儲存持續時間的檔案在退出其範圍時都會被銷毀,無論退出方式為何。因此,Goto 無法繞過物件銷毀:

輸出:*T~T

物件類型限制

跳入範圍時通常禁止使用非標量對象,但具有簡單預設建構子和析構函數的對像有例外。沒有初始化器的數組聲明也可以豁免。

結論

Goto 雖然不是規避 C 作用域機制的漏洞,但如果不小心使用,可能會導致不可預見的行為。儘管如此,上述限制提供了防止無意或有害的 goto 使用的保障措施。因此,它並不像人們普遍認為的那樣本質上是邪惡的,但應該謹慎使用。

以上是C 中「goto」是否繞過析構函式執行?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn