C6211
Aviso C6211: Vazamento de memória <ponteiro> devido a uma exceção.Considere utilizar um bloco catch local para limpar a memória
Esse aviso indicar que a memória alocada não está sendo lançada quando uma exceção é gerada.A instrução no final do caminho pode gerar uma exceção.O analisador verifica essa condição somente quando a anotação SAL _Analysis_mode_(_Analysis_local_leak_checks_) é especificada.Por padrão, a anotação é especificada para o código de modo de kernel do Windows (driver).Para obter mais informações sobre anotações SAL, consulte Usando anotações de SAL para reduzir defeitos de código do C/C++.
Exemplo
O código a seguir gerenciar esse aviso pode ser porque uma exceção lançada durante a segunda alocação e assim ignorar a primeira alocação, ou uma exceção deve ser gerada em algum lugar no código que é representado pelo comentário de “code ...” e assim ignorar 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ções:
// 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 possíveis vazamentos, use os mecanismos que são fornecidos pela biblioteca padrão (STL) do modelo C++.Incluem shared_ptr, unique_ptr e vector.Para obter mais informações, consulte Ponteiros inteligentes (C++ moderno) e Referência da Biblioteca Padrão 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.
}