tipos - Fallo de segmentación después de libre(), ¿cuáles son las causas más comunes de esto?
variables de segmentacion de mercado (7)
Recibo un error de segmentación después de free
cierto puntero:
free(studentDB->name);
Puedo obtener su valor sin ningún error o advertencia:
printf("[DBG] studentDB->name: %s/n", studentDB->name);
Sin embargo, como dije, el programa se bloquea cuando intento liberarlo. ¿Cuáles son las causas más comunes para un comando free
conduce a una falla de segmentación?
¿ studentDB->name
asignado previamente el studentDB->name
? Si no asignó memoria para ese campo, lo más probable es que cuando llame free
, ¡termine con seg-fault! Verifique en ese campo y asegúrese de que sea malloc
d o strdup
d.
O que hay una corrupción en otro lugar en el montón, que coincidió con esto, ya que con razón señaló que puede ver el valor del name
...
Espero que esto ayude, Saludos, Tom.
De la página de manual:
free (ptr) libera el espacio de memoria apuntado por ptr, que debe haber sido devuelto por una llamada previa a malloc (), calloc () o realloc (). De lo contrario, o si ya se ha llamado antes a (ptr), se produce un comportamiento no definido. Si ptr es NULL, no se realiza ninguna operación.
Uno también puede verificar:
- ¿StudentDB es un puntero no nulo de una clase / estructura que contiene un "nombre" de miembro?
- ¿El espacio apuntado por studentDB-> name fue devuelto por malloc / calloc / realloc?
Por lo general, acumula corrupción en otro lugar del programa. El montón generalmente es continuo y el administrador de montón rodea bloques de montón con encabezados para rastrear los bloques: si sobrescribe el encabezado del bloque, el acceso a él es correcto, pero es más probable que falle.
Probablemente ya lo hayas liberado () ''ed o ya sobrescrito la información malloc que precede al bloque con un desbordamiento del búfer
Si no lo hizo malloc()
, no puede free()
. ¿De dónde studentDB->name
?
También podría ser que acceder al nombre del puntero studentDB es una segfault si studentDB es NULL.
Una segfault from free
puede ser causada al llamarlo a un puntero que no estaba asignado con malloc
, o que ya se había free
.
studentDB->name
si publicaras el código donde se studentDB->name
.