C6211
警告 C6211:由于出现异常,正在泄漏内存 <pointer>。 应考虑使用局部 catch 块清理内存
此警告意味着在引发异常时未释放已分配的内存。 语句位于路径末尾可以引发异常。 只有 + 当 _Analysis_mode_(_Analysis_local_leak_checks_) SAL 注释指定了,则分析器检查此条件。 默认情况下,此批注为 windows 内核模式 (驱动程序) 代码指定。 有关 SAL 注释的更多信息,请参见 使用 SAL 批注以减少 C/C++ 代码缺陷。
示例
下面的代码生成此警告,因为异常可能会在第二分配时引发从而泄漏第一个分配,或者异常在“code ...”注释表示的代码可能会引发某处从而泄漏两个分配。
// cl.exe /analyze /c /EHsc /nologo /W4
#include <sal.h>
_Analysis_mode_(_Analysis_local_leak_checks_)
void f( )
{
char *p1 = new char[10];
char *p2 = new char[10];
// code ...
delete[] p2;
delete[] p1;
}
若要使用相同的方法指派和更正此问题,请添加异常处理程序:
// cl.exe /analyze /c /EHsc /nologo /W4
#include <sal.h>
#include <new>
#include <iostream>
using namespace std;
_Analysis_mode_(_Analysis_local_leak_checks_)
void f()
{
char *p1 = nullptr;
char *p2 = nullptr;
try
{
p1 = new char[10];
p2 = new char[10];
// code ...
delete [] p2;
delete [] p1;
}
catch (const bad_alloc& ba)
{
cout << ba.what() << endl;
delete [] p2;
delete [] p1;
}
// code ...
}
若要完全避免这些潜在的泄漏,请使用 C++ 标准模板库 (STL) 提供的结构。 其中包括 shared_ptr、unique_ptr和 向量。 有关更多信息,请参见智能指针(现代C++)和标准C++库参考。
// cl.exe /analyze /c /EHsc /nologo /W4
#include <sal.h>
#include <vector>
#include <memory>
using namespace std;
_Analysis_mode_(_Analysis_local_leak_checks_)
void f( )
{
// use 10-element vectors in place of char[10]
vector<char> v1;
vector<char> v2;
for (int i=0; i<10; ++i) {
v1.push_back('a');
v2.push_back('b');
}
// code ...
// use unique_ptr if you still want char[10]
unique_ptr<char[]> a1(new char[10]);
unique_ptr<char[]> a2(new char[10]);
// code ...
// No need for delete; vector and unique_ptr
// clean up when out of scope.
}