警告 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;
}

mallocfree 的使用在内存泄漏和异常方面有许多缺陷。 若要完全避免此类泄露和异常问题,请使用 C++ 标准库提供的机制。 其中包括 shared_ptrunique_ptrvector。 有关详细信息,请参阅智能指针C++ 标准库

另请参阅

try-except 语句
try-finally 语句