例外処理 : 例外処理でのオブジェクトの解放
この技術情報で例外が発生すると、オブジェクトを解放する必要やメソッドについて説明します。ここでは、次の内容について説明します。
例外をローカルで処理します
オブジェクトを破棄すると技術情報例外
フレームワークまたはアプリケーション割り込み標準のプログラム フローによってスローされる例外。したがって、例外がスローされた場合に適切にリソースを破棄することができるように、オブジェクトの追跡を NEAR 保持することは非常に重要です。
これを行う 2 種類の基本的な方法があります。
ローカルで例外処理は try と catch のキーワードを使用して、 1 種類のステートメントのすべてのオブジェクトを破棄します。
さらに処理のブロックの外側で例外をスローする前に catch ブロックのオブジェクトを破棄します。
この二つの方法には、次の問題となる例へのソリューションとして後で説明します:
void SomeFunc() // Problematic code
{
CPerson* myPerson = new CPerson;
// Do something that might throw an exception.
myPerson->SomeFunc();
// Now destroy the object before exiting.
// If SomeFunc above throws an exception this code will
// not be reached and myPerson will not be deleted.
delete myPerson;
}
上で説明したように、 myPerson は、例外がスローされた場合 SomeFuncによって削除されません。実行は、次の外部の例外ハンドラーに直接ジャンプし、正規関数の終了とオブジェクトを削除するコードをバイパスします。オブジェクトへのポインターがスコープのプログラムが実行している間、例外が関数に、オブジェクトに占有されていたメモリは、復元されたときに出て。これは、メモリ リークいます; これは、メモリ診断を使用して検出されます。
例外をローカルで処理します
try/catch のパラダイムは、メモリ リークを回避し、オブジェクトが破棄されるように例外が発生すると、防御されたプログラミング メソッドを提供します。たとえば、この技術情報で前の例は次のように書き換えることができます:
void SomeFunc()
{
CPerson* myPerson = new CPerson;
try
{
// Do something that might throw an exception.
myPerson->SomeFunc();
}
catch( CException* e )
{
// Handle the exception locally
e->Delete();
}
// Now destroy the object before exiting.
delete myPerson;
}
この例では、新しい例外をキャッチし、ローカルに処理する例外ハンドラーが設定されます。次に、関数が正常に終了し、オブジェクトを破棄します。この例の重要な側面は例外をキャッチするコンテキストが try/catch ブロックによって設定されます。ローカル例外のゾーンがないと、関数では、例外がスローされ、通常は終了し、オブジェクトを破棄することがないことに気付きません。
オブジェクトを破棄すると技術情報例外
例外処理もう一つの方法は、次の外部での例外処理のコンテキストに渡すことです。catch ブロックでは、割り当てられたオブジェクトのクリーンアップをローカルにし、さらに処理の例外をスローできます。
スロー関数は、ヒープにオブジェクトを解放する必要がある場合は、または場合があります。通常は、関数が返される前にオブジェクト ヒープを常に解放すると、関数は、例外をスローする前にヒープ オブジェクトを解放する必要があります。一方、関数が通常は、返される前にそのオブジェクトを解放する場合は、必要なケースで決定するヒープがオブジェクトを解放する必要があるかどうか。
ローカルに割り当てられたオブジェクトがどのようにクリーンアップする方法を次の例に示します。:
void SomeFunc()
{
CPerson* myPerson = new CPerson;
try
{
// Do something that might throw an exception.
myPerson->SomeFunc();
}
catch( CException* e )
{
e->ReportError();
// Destroy the object before passing exception on.
delete myPerson;
// Throw the exception to the next handler.
throw;
}
// On normal exits, destroy the object.
delete myPerson;
}
例外を自動的にフレーム オブジェクトを解放します; フレーム オブジェクトのデストラクターも呼び出されます。
例外をスローすることができる関数をダイヤルする例外をキャッチし、作成したオブジェクトを破棄できるように try/catch ブロックを使用できます。特に、多数の MFC 関数が例外をスローできることに注意してください。
詳細については、 例外: 例外をキャッチし、削除しますを参照してください。