警告 C6211

由于异常,泄漏内存 'pointer'。 请考虑使用本地 catch 块来清理内存

备注

此警告指示异常引发时未释放已分配的内存。 位于路径末尾的语句可能会引发异常。

仅当指定了 _Analysis_mode_(_Analysis_local_leak_checks_) SAL 注释时,分析器才会检查此状况。 默认情况下,为 Windows 内核模式(驱动程序)代码指定此注释。 有关 SAL 注释的详细信息,请参阅使用 SAL 注释减少 C/C++ 代码缺陷

代码分析名称:MEMORY_LEAK_EXCEPTION

示例

以下代码生成警告 C6211,因为第二次分配期间可能会引发异常,从而泄漏第一个分配。 或者,可能会在代码中某个位置引发异常,该代码由“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 和容器(例如 vector)。 有关详细信息,请参阅智能指针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++ 异常处理