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

ERVA abraxas_dragon en yahoo.com.mx
Mar Feb 12 15:49:23 CET 2008


Estimado Steve, como siempre muchas gracias por tu atención.

El pasado 2008-02-12 03:16:01, Steven escribió:
 
S> Hola ERVA,
S> ERVA wrote:
S> > Hola gente.
S> > 
S> > Tengo un problema al momento de liberar memoria, espero me puedan ayudar.
S> > 
S> > He creado una estructura con los siguientes datos:
S> > 
S> > *****
S> > typedef struct dataS {
S> >   unsigned char * d;
S> >   unsigned int l;
S> > } DATA
S> > 
S> > *******
S> > 
S> > Ahora en el main:
S> > 
S> > DATA dato1;
S> > DATA dato2;
S> > 
S> > dato1.d = NULL;
S> > dato1.l = 0;
S> > 
S> > dato2.d = NULL;
S> > dato2.l = 0;
S> > 
S> > /*Operaciones y asigno valores a dato1 y dato2*/
S> > 
S> > if(dato1.d)
S> >   free(dato1.d);
S> > dato1.d = NULL;
S> > dato1.l = 0;
S> > 
S> > if(dato2.d)
S> >   free(dato2.d);
S> > dato2.d = NULL;
S> > dato2.l = 0;
S> > 
S> > ***************
S> > 
S> > El problema es cuando intenta liberar dato2.d, me muestra un mensaje
S> > con la leyenda:
S> > 
S> > "Acccess violation address"
S> > 
S> > Caray! la mera verdad me trae loco... sino es que ya estoy :)
S> > 
S> > Bueno espero haberme explicado. Reciban un saludo y gracias por la
S> > ayuda.
S> > 
S> Si estás usando C, sugiero comprobar los punteros explícitamente con el 
S> valor de 'NULL'. Esto es,
S> if( NULL != dato1.d )
S>    free( dato1.d );
S> if( NULL != dato2.d )
S>    free( dato2.d );
S> De todas maneras, comprueba que 'dato2.d' contiene una dirección válida 
S> de memoria. Es posible que 'dato2.d' fuera liberada previamente. Liberar 
S> una dirección de memoria a través de 'free()' que anteriormente fuese 
S> liberada por 'free()' o implícitamente por 'realloc()' puede provocar 
S> errores.
S> Espero que esto te oriente.
S> Steven

Utilicé la comprobación del puntero como mencionaste; resultado: el mismo. Ahora  cómo puedo comprobar si 'dato2.d' contiene una dirección válida?

Salu2


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