デストラクターを呼び出さずにコード全体に 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 サイトの他の関連記事を参照してください。