警告 C6242
从此 try-block 跳出会强制本地展开。 产生严重的性能损失
此警告指示 jump 语句导致控制流离开 try-finally
的受保护块,而不是掉落。
备注
离开 try-finally
的受保护块,而不是从最后一个语句中掉落,需要进行本地展开。 本地展开通常需要大约 1000 个计算机指令,因此对性能不利。
使用 __leave
退出 try-final 的受保护块。
代码分析名称: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++ 标准库。