警告 C6242
跳出這個 try-block 會強制本機回溯。 造成嚴重效能損失
這個警告表示 jump 語句會讓控制流程離開受保護區塊 try-finally
,而不是由倒入。
備註
離開 的受保護區塊,而不是從最後一個 try-finally
語句中落入,需要進行本機回溯。 本機回溯通常需要大約 1000 部機器的指示,因此對效能不利。
使用 __leave
結束 try-finally 的受保護區塊。
程式碼分析名稱: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++標準連結庫。