Sdílet prostřednictvím


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();
}
 

Viz také

Referenční dokumentace

C6211