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 C-++.Они включают shared_ptr, unique_ptr и вектор.Дополнительные сведения см. в разделах Интеллектуальные указатели (самомоднейшее 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.
}