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 potenzialmente generare un'eccezione.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 perché un'eccezione può essere generata durante la seconda allocazione e pertanto perdere la prima allocazione, o di eccezione può essere generata da un punto qualsiasi del codice rappresentato dal commento "dicode ..." e pertanto 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 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 /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++