[C con Clase] mal uso del metodo free()

Steven R. Davidson vze266ft en verizon.net
Mar Feb 12 04:19:20 CET 2008


Hola ERVA,

ERVA wrote:
> Hola gente.
> 
> Tengo un problema al momento de liberar memoria, espero me puedan ayudar.
> 
> He creado una estructura con los siguientes datos:
> 
> *****
> typedef struct dataS {
>   unsigned char * d;
>   unsigned int l;
> } DATA
> 
> *******
> 
> Ahora en el main:
> 
> DATA dato1;
> DATA dato2;
> 
> dato1.d = NULL;
> dato1.l = 0;
> 
> dato2.d = NULL;
> dato2.l = 0;
> 
> /*Operaciones y asigno valores a dato1 y dato2*/
> 
> if(dato1.d)
>   free(dato1.d);
> dato1.d = NULL;
> dato1.l = 0;
> 
> if(dato2.d)
>   free(dato2.d);
> dato2.d = NULL;
> dato2.l = 0;
> 
> ***************
> 
> El problema es cuando intenta liberar dato2.d, me muestra un mensaje
> con la leyenda:
> 
> "Acccess violation address"
> 
> Caray! la mera verdad me trae loco... sino es que ya estoy :)
> 
> Bueno espero haberme explicado. Reciban un saludo y gracias por la
> ayuda.
> 

Si estás usando C, sugiero comprobar los punteros explícitamente con el 
valor de 'NULL'. Esto es,

if( NULL != dato1.d )
   free( dato1.d );

if( NULL != dato2.d )
   free( dato2.d );

De todas maneras, comprueba que 'dato2.d' contiene una dirección válida 
de memoria. Es posible que 'dato2.d' fuera liberada previamente. Liberar 
una dirección de memoria a través de 'free()' que anteriormente fuese 
liberada por 'free()' o implícitamente por 'realloc()' puede provocar 
errores.


Espero que esto te oriente.

Steven






Más información sobre la lista de distribución Cconclase