[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