警告 C6014

記憶體 'pointer-name' 流失。

這個警告表示指定的指標指向已配置的記憶體,或尚未釋放的一些其他已配置資源。

備註

只有在指定 SAL 註釋時 _Analysis_mode_(_Analysis_local_leak_checks_) ,分析器才會檢查此條件。 根據預設,此批注會針對 Windows 核心模式 (驅動程式) 程式代碼指定。 如需 SAL 註釋的詳細資訊,請參閱 使用 SAL 註釋減少 C/C++程式代碼缺失

當資源通常 別名為 另一個位置時,會針對記憶體和資源流失報告此警告。 當記憶體指標使用 _Out_ 參數註釋、全域變數或傳回值逸出函式時,記憶體會成為別名。 如果自變數已標註其版本預期,則此警告可能會報告函式結束。

程式代碼分析無法辨識記憶體配置器的實際實作(涉及地址算術),而且無法辨識已配置的記憶體(雖然會辨識許多包裝函式)。 在此情況下,分析器無法辨識已配置記憶體併發出此警告。 若要隱藏誤判,請在函式主體左大括弧{前面的行上使用 #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