Freigeben über


C6211

Warnung C6211: Speicherverlust <Zeiger> infolge einer Ausnahme.Verwenden Sie einen lokalen Catch-Block, um den Arbeitsspeicher zu bereinigen.

Diese Warnung gibt an, dass der belegte Arbeitsspeicher bei Auslösung einer Ausnahme nicht freigegeben wird.Die Anweisung am Ende des Pfads löst möglicherweise eine Ausnahme auslösen.Die Analyzerüberprüfungen für dieses an, wenn die _Analysis_mode_(_Analysis_local_leak_checks_) SAL-Anmerkungen angegeben wird.Standardmäßig wird diese Anmerkung für Code Windows-Kernelmodus (Treiber) angegeben.Weitere Informationen zu SAL-Anmerkungen, finden Sie unter Verwenden von SAL-Anmerkungen zum Reduzieren von C/C++-Codefehlern.

Beispiel

Im folgenden Code wird diese Warnung generiert, da eine Ausnahme während der zweiten Zuordnung ausgelöst und die erste Zuordnung insofern freigegeben werden kann oder eine Ausnahme im Code für ausgelöst werden, der durch den "code ..." Kommentar dargestellt wird und beide Zuordnungen insofern freigegeben werden kann.

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

Um die gleichen Zuordnungsmethoden zu verwenden und das Problem zu beheben, fügen Sie einen Ausnahmehandler hinzu:

// 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 ...
}

Um diese Arten von möglichen Verlusten vollständig zu vermeiden, verwenden Sie die Mechanismen die von der C++-Standardvorlagenbibliothek (STL) bereitgestellt werden.Diese schließen shared_ptr, unique_ptr und vector ein.Weitere Informationen finden Sie unter Intelligente Zeiger modernes (C++) und Standard C++ Library Reference.

// 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.
}

Siehe auch

Referenz

C++-Ausnahmebehandlung