Razón de doble libertad o corrupción.

#include #include main() { int *ptr, *tmp; ptr = (int *)malloc(sizeof(int) * 60); tmp = ptr; printf("tmp %u ptr %u\n", tmp, ptr); int i =0; for (i = 0; i < 76; i ++) { *ptr = i; ptr++; } printf("tmp %u ptr %u\n", tmp, ptr); free (tmp); } this program crahes when we run it {124}: ./a.out tmp 23134224 ptr 23134224 tmp 23134224 ptr 23134528 *** glibc detected *** ./a.out: double free or corruption (!prev): 0x0000000001610010 *** ======= Backtrace: ========= /lib64/libc.so.6[0x333ce750c6] ./a.out[0x4005e0] /lib64/libc.so.6(__libc_start_main+0xfd)[0x333ce1ecdd] ./a.out[0x400499] ======= Memory map: ======== 00400000-00401000 r-xp 00000000 00:2b 26388454 /users/home40/rnadakud/cpract/a.out 00600000-00601000 rw-p 00000000 00:2b 26388454 /users/home40/rnadakud/cpract/a.out 01610000-01631000 rw-p 00000000 00:00 0 [heap] 333c600000-333c620000 r-xp 00000000 fd:00 1253867 /lib64/ld-2.12.so 333c81f000-333c820000 r--p 0001f000 fd:00 1253867 /lib64/ld-2.12.so 333c820000-333c821000 rw-p 00020000 fd:00 1253867 /lib64/ld-2.12.so 333c821000-333c822000 rw-p 00000000 00:00 0 333ce00000-333cf97000 r-xp 00000000 fd:00 1253879 /lib64/libc-2.12.so 333cf97000-333d197000 ---p 00197000 fd:00 1253879 /lib64/libc-2.12.so 333d197000-333d19b000 r--p 00197000 fd:00 1253879 /lib64/libc-2.12.so 333d19b000-333d19c000 rw-p 0019b000 fd:00 1253879 /lib64/libc-2.12.so 333d19c000-333d1a1000 rw-p 00000000 00:00 0 333ee00000-333ee16000 r-xp 00000000 fd:00 1253886 /lib64/libgcc_s-4.4.6-20110824.so.1 333ee16000-333f015000 ---p 00016000 fd:00 1253886 /lib64/libgcc_s-4.4.6-20110824.so.1 333f015000-333f016000 rw-p 00015000 fd:00 1253886 /lib64/libgcc_s-4.4.6-20110824.so.1 7f085a471000-7f085a474000 rw-p 00000000 00:00 0 7f085a492000-7f085a495000 rw-p 00000000 00:00 0 7ffffddb2000-7ffffddc7000 rw-p 00000000 00:00 0 [stack] 7ffffddff000-7ffffde00000 r-xp 00000000 00:00 0 [vdso] ffffffffff600000-ffffffffff601000 r-xp 00000000 00:00 0 [vsyscall] Abort (core dumped) 

Soy consciente de que estoy sobrescribiendo la matriz, pero aquí la observación se produce cuando ahora estoy libre (tmp) aunque estoy sobrescribiendo ptr, pero cuando estoy libre (ptr) solo debo liberar los primeros 60 bytes

Así que por favor me pueden ayudar a entender este error.

Sobrescribir invoca un comportamiento indefinido.

En su caso, destruye las estructuras de datos del montón, haciendo que free() haga algo que falla. Por eso se le llama “comportamiento indefinido”, ya que no puede saber cuándo, cómo o si habrá alguna “prueba” observable de que hizo algo mal. O puede venir más tarde cuando el progtwig hace algo aparentemente no relacionado.

Además, por favor no lance el valor de retorno de malloc() en C.

Está escribiendo más allá del final del bloque de memoria que asignó y el comportamiento no está definido.

Soy consciente de que estoy sobrescribiendo la matriz, pero aquí la observación se produce cuando se libera (tmp) ahora, aunque estoy sobrescribiendo ptr, pero cuando libero (ptr) solo debería liberar los primeros 60 bytes.

La memoria asignada al montón suele funcionar almacenando metadatos sobre el bloque de memoria junto con el bloque de memoria. Esto es necesario para que el administrador del montón sepa cómo liberar el bloque de memoria. Después de todo, cuando se pasa un puntero a free , el administrador del montón necesita alguna forma de averiguar cómo desasignar la memoria.

Lo que está sucediendo aquí es que estás corrompiendo esos metadatos y que se detecta cuando se realiza la llamada a free . Se parece mucho a que está utilizando el administrador de almacenamiento dynamic de depuración, que en su tiempo de ejecución implementa el código de depuración para detectar este tipo de daños.