首頁 > 後端開發 > C++ > 在 C 中 `goto` 是否跳過析構函式呼叫?

在 C 中 `goto` 是否跳過析構函式呼叫?

Barbara Streisand
發布: 2024-11-26 12:24:08
原創
367 人瀏覽過

Does `goto` Skip Destructor Calls in C  ?

goto 跳轉可以跨程式碼而不呼叫析構函數嗎?

問題: goto 跳轉真的可以繞過程式碼嗎不執行的部分析構函數?

範例:考慮以下程式碼:

void f() {
   int x = 0;
   goto lol;
}

int main() {
   f();
lol:
   return 0;
}
登入後複製

goto 跳轉後物件 x 會被刪除嗎?

答案:

不,物體x 不會被洩漏。

這個信念是一種常見的誤解。 goto 跳轉不會規避 C 的作用域機制,且析構函數會如預期呼叫。

1.標籤範圍:

Goto 語句不能跨越函數邊界。標籤的範圍僅限於定義它的函數。

2.物件初始化:

Goto 跳轉無法繞過物件初始化。嘗試跳過未初始化的物件將導致編譯器錯誤。同樣,跳回已初始化的物件將導致其先前的實例被銷毀。

3.物件的範圍:

當 goto 跳轉退出其範圍時,具有自動儲存持續時間的物件不會洩漏。 C 確保物件在退出作用域時按照其構造的相反順序被銷毀。

結論:

Goto 跳轉完全尊重 C 的作用域和銷毀規則。不可能使用 goto 來規避這些機制並導致記憶體洩漏。不過,仍然不建議過度使用 goto,因為它會導致程式碼難以理解和維護。

以上是在 C 中 `goto` 是否跳過析構函式呼叫?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板