Goto 可以在不呼叫析構函數的情況下遍歷函數嗎?
一個常見的誤解是 goto 會跳過程式碼段,從而避免執行析構函數和類似函數運作。這種誤解在圍繞 C 的討論中尤其明顯。
範圍限制
與普遍看法相反,goto 無法遍歷函數邊界。嘗試跳到不同函數中定義的標籤會導致編譯器錯誤,如下所示:
錯誤:標籤「lol」已使用但未定義
對象初始化注意事項
同樣不允許跳過物件初始化。如果您嘗試跳過物件的初始化,編譯器將標記一個錯誤:
錯誤:跳到標籤'lol'
錯誤:從這裡
錯誤:交叉初始化'int x'
特定範圍的銷毀
物件具有自動儲存持續時間的檔案在退出其範圍時都會被銷毀,無論退出方式為何。因此,Goto 無法繞過物件銷毀:
輸出:*T~T
物件類型限制
跳入範圍時通常禁止使用非標量對象,但具有簡單預設建構子和析構函數的對像有例外。沒有初始化器的數組聲明也可以豁免。
結論
Goto 雖然不是規避 C 作用域機制的漏洞,但如果不小心使用,可能會導致不可預見的行為。儘管如此,上述限制提供了防止無意或有害的 goto 使用的保障措施。因此,它並不像人們普遍認為的那樣本質上是邪惡的,但應該謹慎使用。
以上是C 中「goto」是否繞過析構函式執行?的詳細內容。更多資訊請關注PHP中文網其他相關文章!