Поделиться через


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

См. также

Ссылки

Обработка исключений С++