「goto」ステートメントはデストラクターを呼び出さずに関数境界を越えることができますか?
一般的に、goto ジャンプはコードの順序どおりの実行をバイパスすると考えられています物体の破壊を含む。ただし、これは C のスコープ規則の誤解から生じる誤解です。
ラベルのスコープ
まず、goto ジャンプはラベルのスコープ内に限定されます。それぞれの機能。提供した例のように、関数の境界を越えてジャンプすることはできません。コンパイラは、ジャンプ元の関数でラベルが定義されていないことを示すエラーを発行します。
オブジェクトの初期化とスコープ
次に、goto ジャンプは、オブジェクトの初期化。オブジェクトが宣言されて初期化されるポイントを超えてジャンプすると、オブジェクトのスコープに入り、そのコンストラクターが呼び出されます。ただし、既に初期化されたオブジェクトのスコープにジャンプが戻された場合は、ジャンプの実行前にそのデストラクターが呼び出されます。
オブジェクト スコープの保持
最後に、自動ストレージ期間を持つオブジェクト (つまり、ブロック内で宣言された変数) は、goto ジャンプによってリークされません。 goto を介してオブジェクトのスコープを離れるとオブジェクトの破棄がトリガーされ、リソース管理が正しく処理されることが保証されます。
結論
一般的な考えに反して、C の goto ステートメントでは許可されません。スコープ ルールに違反する、またはメモリ リークを引き起こす制御されていないジャンプの場合。 goto の使用には設計上の理由から議論の余地がありますが、goto に起因することが多い固有のリスクは生じません。
以上がC の `goto` ステートメントはオブジェクト デストラクターをバイパスしますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。