C6014

avviso C6014: perdita di memoria.

L'avviso indica che i puntatori specifici puntano alla memoria allocata o a un'altra risorsa assegnata che non è stata liberata.L'analizzatore controlla questa condizione solo quando l'annotazione SAL _Analysis_mode_(_Analysis_local_leak_checks_) è specificata.Per impostazione predefinita, questa annotazione viene specificata per il codice (del driver) in modalità kernel di Windows.Per ulteriori informazioni sulle annotazioni SAL, vedere Utilizzo delle annotazioni SAL per ridurre gli errori del codice C/C++.

Esempio

Il codice seguente genera questo avviso:

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

Il codice seguente risolve l'avviso rilasciando la memoria:

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

L'avviso viene visualizzato sia per perdite di risorse che di memoria quando la risorsa crea un suo alias in un'altra posizione.Si crea un alias della memoria quando un puntatore alla memoria esce dalla funzione mediante un'annotazione, una variabile globale, o un valore restituito _Out_.Questo avviso può essere visualizzato all'uscita di funzioni se l'argomento è annotato come previsto per essere rilasciato.

Si noti che lo strumento di analisi del codice non riconoscerà l'effettiva implementazione di un allocatore di memoria (che coinvolge l'aritmetica d'indirizzo) e non riconoscerà la memoria che viene allocata (sebbene molti wrapper saranno riconosciuti).In questo caso, l'analizzatore non riconosce la memoria che è stata allocata e genera problemi con questo avviso.Per eliminare il falso positivo, utilizzare una direttiva #pragma sulla linea che precede la parentesi graffa aperta { nel corpo della funzione.

Per evitare interamente queste potenziali inconsistenze, utilizzare i meccanismi forniti dalla libreria STL (Standard Template Library) di C++.Questi comprendono shared_ptr, unique_ptr e vector.Per ulteriori informazioni, vedere Puntatori intelligenti (C++ moderno) e Riferimento per la libreria standard 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();
}
 

Vedere anche

Riferimenti

C6211