Warnung C6211
Verlust des Speichers "Zeiger" aufgrund einer Ausnahme. Verwenden Sie einen lokalen Catch-Block, um den Arbeitsspeicher zu bereinigen.
Diese Warnung gibt an, dass der zugewiesene Arbeitsspeicher nicht freigegeben wird, wenn eine Ausnahme ausgelöst wird. Die Anweisung am Ende des Pfads könnte eine Ausnahme auslösen.
Hinweise
Der Analyzer überprüft auf diese Bedingung, wenn die _Analysis_mode_(_Analysis_local_leak_checks_)
-SAL-Anmerkung angegeben wird. Standardmäßig ist diese Anmerkung für den Windows-Kernelmoduscode (Treiber) angegeben. Weitere Informationen zu SAL-Anmerkungen finden Sie unter Verwenden von SAL-Anmerkungen zur Reduzierung von C/C++-Codefehlern.
Codeanalysename: MEMORY_LEAK_EXCEPTION
Beispiel
Der folgende Code generiert Warnung C6211, da während der zweiten Zuordnung eine Ausnahme ausgelöst werden kann und dadurch die erste Zuordnung verloren geht. Oder eine Ausnahme könnte irgendwo im Code ausgelöst werden, der durch den Kommentar "code ...
" dargestellt wird und dadurch beide Zuordnungen durchläuft.
// 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 Zuordnungsfunktionen zu verwenden und dieses 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 potenzieller Lecks vollständig zu vermeiden, verwenden Sie die Mechanismen, die von der C++-Standardbibliothek (STL) bereitgestellt werden. Dazu gehören shared_ptr
, , unique_ptr
und Container wie vector
. Weitere Informationen finden Sie unter Intelligente Zeiger und C++-Standardbibliothek.
// 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.
}