C6211
Предупреждение C6211: Утечка памяти <указатель> из-за исключения.Попробуйте использовать локальный блок catch для очистки памяти.
Данное предупреждение указывает, что при возникновении исключения выделенная память не была освобождена.Оператор в конце пути может создать исключение.Анализатор проверяет наличие этого условия, только если указана аннотация SAL _Analysis_mode_(_Analysis_local_leak_checks_).По умолчанию эта аннотация указана для кода в режиме ядра Windows (драйвера).Дополнительные сведения об аннотациях SAL см. в разделе Использование аннотаций SAL для сокращения количества дефектов в коде C/C++.
Пример
В следующем коде создается данное предупреждение, поскольку исключение может создаваться во время второго выделения, и поэтому происходит утечка первого выделения, или исключение может создаваться где-либо в коде, представленном комментарием "code ...", и поэтому происходит утечка обоих выделений.
// 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;
}
Для использования тех же методов выделения и устранения этой проблемы добавьте обработчик исключений:
// 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 ...
}
Чтобы избежать все эти типы возможных утечек, используйте механизмы, предоставляемые библиотекой стандартных шаблонов (STL) C++.Они включают shared_ptr, unique_ptr и vector.Дополнительные сведения см. в разделах Интеллектуальные указатели (современный C++) и Справочник по стандартной библиотеке 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.
}