ホームページ > バックエンド開発 > C++ > C では `goto` はデストラクター呼び出しをスキップしますか?

C では `goto` はデストラクター呼び出しをスキップしますか?

Barbara Streisand
リリース: 2024-11-26 12:24:08
オリジナル
431 人が閲覧しました

Does `goto` Skip Destructor Calls in C  ?

デストラクターを呼び出さずにコード全体に goto ジャンプできますか?

質問: goto ジャンプでコードをバイパスできるというのは本当ですか?実行しないセクションdestructors?

例: 次のコードを考えてみましょう:

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

int main() {
   f();
lol:
   return 0;
}
ログイン後にコピー

オブジェクト x は goto ジャンプ後に削除されますか?

答え:

いいえ、オブジェクト x はそうではありません。

この考えはよくある誤解です。 goto ジャンプは C のスコープ機構を回避せず、デストラクターは期待どおりに呼び出されます。

1.ラベルのスコープ:

Goto ステートメントは関数の境界を越えてジャンプできません。ラベルのスコープは、ラベルが定義されている関数に制限されます。

2.オブジェクトの初期化:

Goto ジャンプはオブジェクトの初期化をバイパスできません。初期化されていないオブジェクトを越えてジャンプしようとすると、コンパイラ エラーが発生します。同様に、初期化されたオブジェクトをまたいで戻ると、その前のインスタンスが破棄されます。

3.オブジェクトのスコープ:

自動ストレージ期間を持つオブジェクトは、goto ジャンプがスコープを出るときにリークされません。 C は、スコープを出るときにオブジェクトがその構築の逆の順序で破棄されることを保証します。

結論:

Goto ジャンプは C のスコープと破棄ルールを完全に尊重します。 goto を使用してこれらのメカニズムを回避し、メモリ リークを引き起こすことはできません。ただし、goto を過度に使用することは、コードの理解と保守が困難になる可能性があるため、推奨されません。

以上がC では `goto` はデストラクター呼び出しをスキップしますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート