C6211
Ostrzeżenie C6211: przecieki pamięci <pointer> z powodu wyjątku.Rozważ czyszczenie pamięci przy użyciu lokalnego bloku catch
To ostrzeżenie wskazuje, że że przydzielonej pamięci nie jest zwalniany, gdy występuje wyjątek.W sprawozdaniu na końcu ścieżki może zgłosić wyjątek.Analizator sprawdza ten dodatkowy warunek tylko wtedy, gdy _Analysis_mode_(_Analysis_local_leak_checks_) SAL adnotacji jest określona.Domyślnie ta adnotacja określono kod (sterownik) trybu jądra systemu Windows.Aby uzyskać więcej informacji na temat adnotacji SAL, zobacz Za pomocą adnotacji SAL do zmniejszenia wady kod C/C++.
Przykład
Poniższy kod generuje, to ostrzeżenie, ponieważ może się wyjątek podczas drugi przydział, a tym samym przeciek pierwszej alokacji lub może być wyjątek gdzieś w kodzie, który jest reprezentowany przez "code ..." dodać komentarz, a tym samym wyciek obu alokacje.
// 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;
}
Aby użyć tych samych metod alokacji i rozwiązać ten problem, należy dodać procedury obsługi wyjątków:
// 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 ...
}
Aby uniknąć tego rodzaju potencjalne wycieki całkowicie, należy użyć mechanizmów, które są dostarczane przez C++ biblioteki szablon standardowy (STL).Należą do nich shared_ptr, unique_ptr, i wektor.Aby uzyskać więcej informacji, zobacz Inteligentne kursory (Podręcznik programowania C++ nowoczesny) i Biblioteka języka C++ wzorcowego.
// 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.
}