Condividi tramite


C6211

avviso C6211: Perdita di memoria <puntatore> a causa di un'eccezione.Si consiglia di utilizzare un blocco catch locale per pulire la memoria

L'avviso indica che la memoria allocata non viene liberata quando si genera un'eccezione.L'istruzione alla fine del percorso potrebbe generare un'eccezione.I controlli dell'analizzatore per questo una probabile condizione solo quando le annotazioni SAL di _Analysis_mode_(_Analysis_local_leak_checks_) è specificata.Per impostazione predefinita, questa voce viene specificata per il codice in modalità kernel di Windows (driver).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 perché un'eccezione può essere generata durante la seconda allocazione e pertanto perdere la prima allocazione, o un'eccezione può essere generata da un punto qualsiasi del codice rappresentato dal commento "dicode ..." e quindi perdere entrambe le allocazioni.

// cl.exe /analyze /c /EHsc /nologo /W4 
#include <sal.h>
 
_Analysis_mode_(_Analysis_local_leak_checks_) 
void f( )
{
    char *p1 = new char[10];
    char *p2 = new char[10];
 
    // code ...
 
    delete[] p2;
    delete[] p1;
}

Per utilizzare gli stessi metodi di allocazione e per risolvere il problema, aggiungere un gestore di eccezioni:

// cl.exe /analyze /c /EHsc /nologo /W4
#include <sal.h>
#include <new>
#include <iostream>
using namespace std;
 
_Analysis_mode_(_Analysis_local_leak_checks_) 
 
void f()
{
    char *p1 = nullptr; 
    char *p2 = nullptr;
 
    try
    {
        p1 = new char[10];
        p2 = new char[10];
 
        // code ...
 
        delete [] p2;
        delete [] p1;
    }
    catch (const bad_alloc& ba)
    {
        cout << ba.what() << endl;
        delete [] p2;
        delete [] p1;
    }
    // code ...
}

Per evitare questi tipi di perdite potenziali complessivamente, utilizzare i meccanismi forniti dalla libreria standard (STL) del modello di C++.Questi includono shared_ptr, unique_ptre vettore.Per ulteriori informazioni, vedere Puntatori intelligenti (C++ moderno) e Riferimento della libreria C++ standard.

// cl.exe /analyze /c /EHsc /nologo /W4
#include <sal.h>
#include <vector>
#include <memory>
 
using namespace std;
 
_Analysis_mode_(_Analysis_local_leak_checks_) 
 
void f( )
{
    // use 10-element vectors in place of char[10]
    vector<char> v1;
    vector<char> v2;
 
    for (int i=0; i<10; ++i) {
        v1.push_back('a');
        v2.push_back('b');
    }
    // code ...
 
    // use unique_ptr if you still want char[10]
    unique_ptr<char[]> a1(new char[10]);
    unique_ptr<char[]> a2(new char[10]);
    
    // code ...
 
    // No need for delete; vector and unique_ptr 
    // clean up when out of scope.
}

Vedere anche

Riferimenti

Gestione delle eccezioni C++