C6014
upozornění C6014: nevrací paměť.
Toto upozornění signalizuje, že body určené ukazatel do přidělené paměti nebo některé jiné přidělených prostředků, která nebyla uvolněna.Analyzátor hledá tento stav jen tehdy, když _Analysis_mode_(_Analysis_local_leak_checks_) zadané poznámky SAL.Ve výchozím nastavení tato poznámka je určena pro kód (ovladač) režimu jádra systému Windows.Další informace o poznámky SAL, viz Použití poznámek SAL k snížení míry výskytu závad kódu C/C++.
Příklad
Následující kód generuje toto upozornění:
// 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();
}
Následující kód odstraňuje upozornění uvolněním paměti:
// 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();
}
Toto upozornění je vykazován nevracení paměti a prostředků v případě, že zdroj je běžně alias do jiného umístění.Paměť je alias, je-li ukazatel do paměti řídící funkce prostřednictvím _Out_ parametr poznámky, globální proměnné nebo vrácené hodnoty.Toto upozornění může být hlášena na konec funkce, je-li argument je označena jako mají očekávat, že se uvolní.
Poznámka: Analýza kódu nerozpozná skutečného provedení přidělenou paměť (zahrnující adresu aritmetické) a nerozpozná že paměť je přidělen (Ačkoli mnoho obálky bude rozpoznán).V tomto případě analyzátor nerozpozná, že paměť byla přidělena a vydává toto upozornění.Chcete-li potlačit falešně pozitivní, použijte #pragma směrnice na řádku, který předchází otevírací složenou závorkou { těla funkce.
Tyto druhy potenciální nevracení zcela vyhnout, použijte mechanismy, které jsou k dispozici v C++ šablonu knihovny STL (Standard).Patří mezi ně shared_ptr, unique_ptr, a vektorové.Další informace naleznete v tématu Chytré ukazatele (moderní verze jazyka C++) a Standardní knihovna C++ – referenční dokumentace.
// 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();
}