Advertencia C6014

Pérdida de memoria "pointer-name".

Esta advertencia indica que el puntero especificado apunta a la memoria asignada o a algún otro recurso asignado que no se ha liberado.

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++.

Esta advertencia se notifica tanto para pérdidas de memoria como de recursos cuando se agrega un alias al recurso en otra ubicación. La memoria se aplica un alias cuando un puntero a la memoria escapa de la función mediante una anotación de parámetros, una variable global o un _Out_ valor devuelto. Esta advertencia se puede notificar en la salida de la función si el argumento se anota que se espera su versión.

El análisis de código no reconocerá la implementación real de un asignador de memoria (que implica la aritmética de direcciones) y no reconocerá esa memoria (aunque se reconocerán muchos contenedores). En este caso, el analizador no reconoce que se asignó la memoria y emite esta advertencia. Para suprimir el falso positivo, use una directiva #pragma warning(disable: 6014) en la línea que precede a la llave de apertura { del cuerpo de la función.

Nombre del análisis de código: MEMORY_LEAK

Ejemplos

El código siguiente genera la advertencia C6014:

// cl.exe /analyze /EHsc /nologo /W4
#include <sal.h>
#include <stdlib.h>
#include <string.h>

_Analysis_mode_(_Analysis_local_leak_checks_)

#define ARRAYSIZE 10
const int TEST_DATA [ARRAYSIZE] = {10,20,30,40,50,60,70,80,90,100};

void f( )
{
    int *p = (int *)malloc(sizeof(int)*ARRAYSIZE);
    if (p) {
        memcpy(p, TEST_DATA, sizeof(int)*ARRAYSIZE);
        // code ...
    }
}

int main( )
{
    f();
}

El código siguiente libera memoria para corregir la advertencia:

// cl.exe /analyze /EHsc /nologo /W4
#include <sal.h>
#include <stdlib.h>
#include <string.h>

_Analysis_mode_(_Analysis_local_leak_checks_)

#define ARRAYSIZE 10
const int TEST_DATA [ARRAYSIZE] = {10,20,30,40,50,60,70,80,90,100};

void f( )
{
    int *p = (int *)malloc(sizeof(int)*ARRAYSIZE);
    if (p) {
        memcpy(p, TEST_DATA, sizeof(int)*ARRAYSIZE);
        // code ...
        free(p);
    }
}

int main( )
{
    f();
}

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 /EHsc /nologo /W4
#include <sal.h>
#include <memory>

using namespace std;

_Analysis_mode_(_Analysis_local_leak_checks_)

const int ARRAYSIZE = 10;
const int TEST_DATA [ARRAYSIZE] = {10,20,30,40,50,60,70,80,90,100};

void f( )
{
    unique_ptr<int[]> p(new int[ARRAYSIZE]);
    std::copy(begin(TEST_DATA), end(TEST_DATA), p.get());

    // code ...

    // No need for free/delete; unique_ptr
    // cleans up when out of scope.
}

int main( )
{
    f();
}

Consulte también

Advertencia C6211