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


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

См. также

Ссылки

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