Advertencia C6211

Pérdida de memoria "puntero" debido a una excepción. Considere la posibilidad de usar un bloque catch local para limpiar la memoria

Esta advertencia indica que la memoria asignada no se libera cuando se produce una excepción. La instrucción al final de la ruta de acceso podría producir una excepción.

Comentarios

El analizador comprueba esta condición solo cuando se especifica la anotación SAL _Analysis_mode_(_Analysis_local_leak_checks_). De forma predeterminada, esta anotación se especifica para el código del modo kernel de Windows (controlador). Para más información sobre el uso de anotaciones SAL, consulte Uso de anotaciones SAL para reducir los defectos en el código de C/C++.

Nombre del análisis de código: MEMORY_LEAK_EXCEPTION

Ejemplo

El código siguiente genera la advertencia C6211 porque se podría producir una excepción durante la segunda asignación y, por tanto, se pierde la primera asignación. O bien, se podría producir una excepción en algún lugar del código representado por el comentario "code ..." y, por tanto, filtrar ambas asignaciones.

// 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 las mismas funciones de asignación y corregir este problema, agregue un controlador de excepciones:

// 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 estos tipos de posibles fugas por completo, use los mecanismos proporcionados por la biblioteca estándar de C++ (STL). Entre ellos se incluyen shared_ptrlos contenedores , unique_ptry , como vector. Para más información, consulte los artículos sobre punteros inteligentes y la biblioteca estándar de 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.
}

Consulte también

Control de excepciones de C++