C6211

C6211 de aviso: Vazamento de memória <pointer> por causa de uma exceção.Considere usar um bloco catch local para limpar a memória

Este aviso indica que a memória alocada não está sendo liberada quando uma exceção é lançada.A instrução no final do caminho pode lançar uma exceção.O analisador verifica essa condição somente quando a anotação de SAL de _Analysis_mode_(_Analysis_local_leak_checks_) é especificado.Por padrão, a anotação é especificada para o código do kernel do Windows (driver).Para obter mais informações sobre as anotações de SAL, consulte Usando o SAL anotações para reduzir os defeitos no código C/C++.

Exemplo

O seguinte código gera este aviso como uma exceção pode ser acionada durante a segunda alocação e assim pular a primeira alocação, ou uma exceção pode ser lançada em algum lugar no código que é representado pelo comentário "code ...” e assim escapar ambas as alocações.

// 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;
}

Para usar os mesmos métodos de alocação e corrigir esse problema, adicione um manipulador de exceção:

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

Para evitar completamente esses tipos de vazamentos potenciais, use os mecanismos que são fornecidos pela biblioteca padrão (STL) o modelo de C++.Esses incluem shared_ptr, unique_ptr, e vetor.Para obter mais informações, consulte Ponteiros inteligentes (guia de programação do C++ moderno) e Standard C++ Library Reference.

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

Consulte também

Referência

Manipulação de exceção do C++