警告 C6014

泄漏内存“pointer-name”。

此警告表示指定的指针指向已分配的内存或其他某个已分配但尚未释放的资源。

备注

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

当资源经常别名到另一个位置时,会针对内存和资源泄漏报告此警告。 当指向内存的指针通过 _Out_ 参数注释、全局变量或返回值转义函数时,会对内存使用别名。 如果参数被注释为应释放它,则在函数退出时可能会报告此警告。

Code Analysis 无法识别内存分配器的实际实现(涉及到地址运算),也无法识别已分配内存的情况(但是可以识别很多包装器)。 在这种情况下,该分析器无法识别内存已分配的情况,并发出此警告。 若要禁止显示错误警报,请在函数体左大括号 { 之前的行上使用 #pragma warning(disable: 6014) 指令。

代码分析名称:MEMORY_LEAK

示例

下面的代码生成警告 C6014:

// cl.exe /analyze /EHsc /nologo /W4
#include <sal.h>
#include <stdlib.h>
#include <string.h>

_Analysis_mode_(_Analysis_local_leak_checks_)

#define ARRAYSIZE 10
const int TEST_DATA [ARRAYSIZE] = {10,20,30,40,50,60,70,80,90,100};

void f( )
{
    int *p = (int *)malloc(sizeof(int)*ARRAYSIZE);
    if (p) {
        memcpy(p, TEST_DATA, sizeof(int)*ARRAYSIZE);
        // code ...
    }
}

int main( )
{
    f();
}

以下代码通过释放内存来更正此警告:

// cl.exe /analyze /EHsc /nologo /W4
#include <sal.h>
#include <stdlib.h>
#include <string.h>

_Analysis_mode_(_Analysis_local_leak_checks_)

#define ARRAYSIZE 10
const int TEST_DATA [ARRAYSIZE] = {10,20,30,40,50,60,70,80,90,100};

void f( )
{
    int *p = (int *)malloc(sizeof(int)*ARRAYSIZE);
    if (p) {
        memcpy(p, TEST_DATA, sizeof(int)*ARRAYSIZE);
        // code ...
        free(p);
    }
}

int main( )
{
    f();
}

若要完全避免这些潜在的泄露问题,请使用 C++ 标准库 (STL) 提供的机制。 其中包括 shared_ptrunique_ptr 和容器(例如 vector)。 有关详细信息,请参阅智能指针C++ 标准库

// cl.exe /analyze /EHsc /nologo /W4
#include <sal.h>
#include <memory>

using namespace std;

_Analysis_mode_(_Analysis_local_leak_checks_)

const int ARRAYSIZE = 10;
const int TEST_DATA [ARRAYSIZE] = {10,20,30,40,50,60,70,80,90,100};

void f( )
{
    unique_ptr<int[]> p(new int[ARRAYSIZE]);
    std::copy(begin(TEST_DATA), end(TEST_DATA), p.get());

    // code ...

    // No need for free/delete; unique_ptr
    // cleans up when out of scope.
}

int main( )
{
    f();
}

另请参阅

警告 C6211