次の方法で共有


C6242

警告 C6242: この try ブロックからのジャンプは、ローカル アンワインドを強制します。パフォーマンスがかなり低下します

この警告は、フォール スルー以外の方法によって、ジャンプ ステートメントにより制御フローが保護されている try-finally ブロックを離れることを示します。

最後のステートメントからフォール スルーする以外の方法で、保護されている try-finally ブロック を離れるには、ローカル アンワインドを実行する必要があります。一般的に、ローカル アンワインドには約 1000 個のマシン語命令が必要なため、パフォーマンスの低下を招きます。

保護されている try-finally ブロックを抜けるには、_leave を使用します。

使用例

この警告が発生するコード例を次に示します。

#include <malloc.h>
void DoSomething(char *p); // function can throw exception

int f( )
{
   char *ptr = 0;
   __try 
   {
      ptr = (char*) malloc(10);
      if ( !ptr ) 
      {
         return 0;   //Warning: 6242
      }
      DoSomething( ptr );
   }
   __finally 
   {
      free( ptr );
   }
   return 1;
}

この警告を解決するには、次のコードに示すように __leave を使用します。

#include <malloc.h>
void DoSomething(char *p); 
int f()
{
   char *ptr = 0;
   int retVal = 0;

   __try 
   {
      ptr = (char *) malloc(10);
      if ( !ptr )
      {
         retVal = 0;
         __leave;   //No warning
      }
      DoSomething( ptr );
      retVal = 1;
   }
   __finally
   {
      free( ptr );
   }

   return retVal;
}

malloc と free の使用には、メモリ リークと例外に関して多くの落とし穴があります。これらのリークと例外の問題を完全に回避するには、C++ の標準テンプレート ライブラリ (STL) によって提供される機構を使用します。これには、shared_ptrunique_ptrvector などがあります。詳細については、「スマート ポインター (Modern C++)」および「C++ 標準ライブラリ リファレンス」を参照してください。

参照

関連項目

try-finally ステートメント