C6211C6211

Advertencia C6211: pérdida de memoria <puntero > debido a una excepción.warning C6211: Leaking memory <pointer> due to an exception. Considere el uso de un bloque catch local para limpiar la memoriaConsider using a local catch block to clean up memory

Esta advertencia indica que la memoria asignada no se libera cuando se produce una excepción.This warning indicates that allocated memory is not being freed when an exception is thrown. La instrucción al final de la ruta de acceso podría producir una excepción.The statement at the end of the path could throw an exception. El analizador comprueba esta condición solo cuando se especifica la anotación SAL _Analysis_mode_(_Analysis_local_leak_checks_).The analyzer checks for this condition only when the _Analysis_mode_(_Analysis_local_leak_checks_) SAL annotation is specified. De forma predeterminada, esta anotación se especifica para el código del modo kernel de Windows (controlador).By default, this annotation is specified for Windows kernel mode (driver) code. Para obtener más información acerca de las anotaciones de SAL, consulte utilizar anotaciones SAL para reducir defectos de código de C o C++.For more information about SAL annotations, see Using SAL Annotations to Reduce C/C++ Code Defects.

EjemploExample

El código siguiente genera esta advertencia porque una excepción puede producirse durante la segunda asignación y, por tanto, pérdida la primera asignación, o podría producirse una excepción en algún lugar en el código que se representa mediante la "code ..." comentario y, por tanto, la pérdida de ambas asignaciones.The following code generates this warning because an exception could be thrown during the second allocation and thereby leak the first allocation, or an exception could be thrown somewhere in the code that's represented by the "code ..." comment and thereby leak both allocations.

// 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:To use the same allocation methods and correct this problem, add an exception handler:

// 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 pérdidas, use los mecanismos proporcionados por la biblioteca de plantillas estándar (STL) de C++.To avoid these kinds of potential leaks altogether, use the mechanisms that are provided by the C++ Standard Template Library (STL). Puede tratarse de shared_ptr, unique_ptr, y vector.These include shared_ptr, unique_ptr, and vector. Para obtener más información, consulte punteros inteligentes y biblioteca estándar de C++.For more information, see Smart Pointers and C++ Standard Library.

// 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énSee Also

Control de excepciones de C++C++ Exception Handling