記憶體 '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_ptr、 unique_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();
}