Compartir a través de


C6014

Advertencia C6014: Pérdida de memoria

La advertencia indica que los puntos especificados del puntero a la memoria asignada o a otro recurso asignado no se ha liberado.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:

// 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 corrige esta advertencia liberando memoria:

// 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();
}

La advertencia se muestra para las pérdidas de memoria y pérdidas de recursos cuando se tiene el recurso normalmente con alias a otra ubicación.La memoria tiene alias cuando un puntero a la memoria escapa a la función mediante una anotación de un parámetro, una variable global o un valor devuelto _Out_ .La advertencia se puede notificar sobre el resultado de la función si el argumento se anota como en espera para ser liberado.

Observe que el análisis de código no reconocerá la implementación real de un asignador de memoria (que implica aritmética de dirección) y no reconocerá que memoria está asignada (aunque muchos contenedores se reconocidos).En este caso, el analizador no reconoce que se asignó la memoria y problemas esta advertencia.Para suprimir el falso positivo, utilice una directiva de #pragma en la línea que precede a la llave de apertura { del cuerpo de la función.

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 /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();
}
 

Vea también

Referencia

C6211