私はVishal Kochharの優れたarticleに、C++コンパイラがどのように例外処理を実装したかについて基本的な考え方を持っています。 try/catch構文は、関数に表示されたときに、基本的に、コンパイラはこのように、プロローグ/エピローグコードを生成します:質問がある暗黙的な例外処理
push -1
push offset new_handler
mov eax, fs:[0]
push eax ; old handler saved on the stack
mov fs[0], esp
...
mov ecx, [ebp-0Ch] ; recover old handler
mov fs[0], ecx
を、このようなものは、コンパイラによって挿入された理由は何ですか一見例外処理とは何の関係もない関数に変換しますか?ソースコードによれば、自分の体にtry/catchブロックは存在しないと確信しています。
範囲外になったときに「自動的に」解放する必要がある管理対象タイプのために挿入される暗黙的なtry/catchフレームがあることがあります。 –
C++コードと生成されたアセンブリコードの間にiff関係はありません。あなたが見ているコードパターンが、C++ソースのtry/catch構造のインジケータではないことは、暗黙的であるかどうかにかかわらず、複数の上位レベルの構造をサポートするために使用できるパターンに過ぎません。 –
例外は、スローポイントとキャッチポイントの間で呼び出される関数を通過し、途中でクリーンアップ(自動保存期間のデストラクタでオブジェクトを正しい順序でクリーンアップするなど)する必要があります。介入する機能で何かをしなければ、これを実現させる実際的な方法はありません。 – Peter