次の方法で共有


例外処理 : 例外処理でのオブジェクトの解放

この技術情報で例外が発生すると、オブジェクトを解放する必要やメソッドについて説明します。ここでは、次の内容について説明します。

  • 例外をローカルで処理します

  • オブジェクトを破棄すると技術情報例外

フレームワークまたはアプリケーション割り込み標準のプログラム フローによってスローされる例外。したがって、例外がスローされた場合に適切にリソースを破棄することができるように、オブジェクトの追跡を NEAR 保持することは非常に重要です。

これを行う 2 種類の基本的な方法があります。

  • ローカルで例外処理は trycatch のキーワードを使用して、 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 関数が例外をスローできることに注意してください。

詳細については、 例外: 例外をキャッチし、削除しますを参照してください。

参照

概念

例外処理 (MFC)