C6308
Advertencia C6308: 'realloc' puede devolver un puntero nulo: se asignará un puntero nulo a <variable>, que se pasó como argumento en 'realloc', provocará que el bloque de memoria original tenga pérdidas.
Esta advertencia indica una pérdida de memoria que es el resultado del uso incorrecto de una función de reasignación.Las funciones de reasignación de montón no liberan el búfer pasado si la reasignación no se realiza correctamente.Para corregir el defecto, asigne el resultado de la función de reasignación a un temporal y, a continuación, reemplace el puntero original después de la reasignación correcta.
Ejemplo
El siguiente ejemplo de código genera esta advertencia:
#include <malloc.h>
#include <windows.h>
void f( )
{
char *x;
x = (char *) malloc(10);
if (x != NULL)
{
x = (char *) realloc(x, 512);
// code...
free(x);
}
}
Para corregir esta advertencia, utilice el código siguiente:
#include <malloc.h>
#include <windows.h>
void f()
{
char *x, *tmp;
x = (char *) malloc(10);
if (x != NULL)
{
tmp = (char *) realloc(x,512);
if (tmp != NULL)
{
x = tmp;
}
free(x);
}
}
Esta advertencia puede generare ruido si existe un alias activo para el búfer que se va a asignar en el momento de asignar el resultado de la función de reasignación.
Para evitar todos estos tipos de problemas, use los mecanismos proporcionados por la Biblioteca de plantillas estándar (STL) 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++.