Compartir a través de


Advertencia C6308

'realloc' puede devolver un puntero nulo: al asignar un puntero nulo a 'parameter-name', que se pasa como argumento a 'realloc', se producirá la pérdida del bloque de memoria original.

Comentarios

Las funciones de reasignación del montón no liberan el búfer pasado si la reasignación no es correcta, lo que podría provocar una pérdida de memoria si no se controla correctamente. Para corregir el problema, asigne el resultado de la función de reasignación a una variable temporal y, a continuación, reemplace el puntero original después de la reasignación correcta.

Nombre del análisis de código: REALLOCLEAK

Ejemplo

El código de ejemplo siguiente genera la advertencia C6308. Este problema se deriva de la asignación del valor devuelto de realloc a x. Si realloc se produce un error y devuelve un puntero nulo, no se liberará la memoria original a x la que apunta:

#include <malloc.h>
#include <windows.h>

void f( )
{
    char *x = (char *) malloc(10);
    if (x != NULL)
    {
        x = (char *) realloc(x, 512);
        // code...
        free(x);
    }
}

Para resolver el problema, puede crear una variable temporal para almacenar el valor devuelto de realloc. Este cambio le permite liberar la memoria asignada previamente de forma segura si realloc se produce un error:

#include <malloc.h>
#include <windows.h>

void f()
{
    char *x = (char *) malloc(10);
    if (x != NULL)
    {
        char *tmp = (char *) realloc(x,512);
        if (tmp != NULL)
        {
            x = tmp;
        }
        // code...
        free(x);
    }
}

Esta advertencia podría generar ruido si hay un alias activo en el búfer que se va a reasignar en el momento de la asignación del resultado de la función de reasignación.

Para evitar estos tipos de problemas por completo, use los mecanismos proporcionados por la biblioteca estándar (STL) de C++. 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++.

Consulte también

Advertencia C6014