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_ptrunique_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.
}

请参见

参考

C++异常处理