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.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 obtener más información sobre las anotaciones SAL, consulte 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 por tanto perder 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 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++