警告 C6242
この try ブロックから飛び出した場合、ローカル アンワインドが強制されます。 パフォーマンスがかなり低下します
この警告は、ジャンプ ステートメントがフォール スルー以外で制御フローを try-finally
の保護ブロックから離脱させることを示します。
解説
最後のステートメントからフォール スルーする以外の方法で、保護されている try-finally
ブロック を離れるには、ローカル アンワインドを実行する必要があります。 ローカル アンワインドには通常約 1000の マシン語命令が必要なため、パフォーマンスの低下を招きます。
保護されている try-finally ブロックを抜けるには、__leave
を使用します。
コード分析名: LOCALUNWINDFORCED
例
この警告が発生するコード例を次に示します。
#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++ の標準ライブラリによって提供される機構を使用します。 これらには、 shared_ptr
、 unique_ptr
、および vector
が含まれます。 詳細については、「スマート ポインター」および「C++ 標準ライブラリ」を参照してください。
関連項目
フィードバック
https://aka.ms/ContentUserFeedback」を参照してください。
以下は間もなく提供いたします。2024 年を通じて、コンテンツのフィードバック メカニズムとして GitHub の issue を段階的に廃止し、新しいフィードバック システムに置き換えます。 詳細については、「フィードバックの送信と表示