Compartir a través de


C6211

Advertencia C6211: Pérdida de memoria <puntero> debido a una excepción.Considere utilizar un bloque catch local para limpiar la memoria

Esta advertencia indica que la memoria asignada no se libera cuando se inicia una excepción.La instrucción al final de la ruta de acceso podría producir una excepción.Comprueba el analizador esta condición sólo cuando se especifica la anotación de _Analysis_mode_(_Analysis_local_leak_checks_) SAL.De forma predeterminada, esta anotación se especifica para el código en modo kernel de Windows (controlador).Para obtener más información sobre las anotaciones SAL, vea Utilizar anotaciones SAL para reducir defectos de código de C/C++.

Ejemplo

El código siguiente genera esta advertencia porque una excepción podría producirse durante la segunda asignación y por tanto perder la primera asignación, o una excepción podría producirse en alguna parte del código que representa el comentario de “code ...” y de esta manera se pierdan 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 los mismos métodos 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 estas clases escapa de posibles en conjunto, utilice los mecanismos proporcionados por la biblioteca estándar (STL) de plantillas de C++.Estos incluyen shared_ptr, unique_ptr, y vector.Para obtener más información, vea Punteros inteligentes (C++ moderno) y Referencia de 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.
}

Vea también

Referencia

Control de excepciones de C++