Ну, imo, segfault, который вы получаете в этот момент, не потому, что вы пытаетесь освободить память, которую вы не выделяли ранее, segfault происходит, потому что вы пытаетесь сослаться на адрес памяти, который операционная система не предоставила вам разрешение. для вас (это определение ошибки сегментации).
В некоторых экспериментах говорится, что вы будете запускать свой пример кода в valgrind, вы получите это как вывод:
==6945== Invalid free() / delete / delete[]
==6945== at 0x402265C: free (vg_replace_malloc.c:323)
==6945== by 0x80483D5: main (bla.c:6)
==6945== Address 0x7 is not stack'd, malloc'd or (recently) free'd
==6945==
==6945== ERROR SUMMARY: 1 errors from 1 contexts (suppressed: 11 from 1)
==6945== malloc/free: in use at exit: 4 bytes in 1 blocks.
==6945== malloc/free: 1 allocs, 1 frees, 4 bytes allocated.
Так что это утечка памяти 'pur sang'. Теперь предположим, что вы измените код так, чтобы указатель, который вы пытаетесь освободить, был «рядом» с указанным вами указателем (чтобы операционная система все еще знала, что у вас есть к ней доступ, операционная система не предоставляет доступ к памяти на границах байтов). Скажем, мы модифицируем код следующим образом:
int main(){
int* c;
c = (int*)malloc(sizeof(int));
c++;
free(c);
return 0;
}
При запуске этого приложения вы больше не будете получать ошибку сегментации (генерируемую ядром), а предупреждение от glibc (владельца malloc () и free ())
edb@Flying-Spaghetti-Monster:/tmp$ ./a.out
*** glibc detected *** ./a.out: free(): invalid pointer: 0x0804a00c ***
... followed by a trace
Итак, вы пытаетесь освободить некоторую память, о которой ядро знает, что оно принадлежит вам, но о которой glibc не может вспомнить, передавая ее вам. Если вы запустите это в valgrind (который работает путем замены функции lib (), malloc (), realloc (), ... в libc и выполнения учета самостоятельно), вы получите такой вывод:
==6955== Invalid free() / delete / delete[]
==6955== at 0x402265C: free (vg_replace_malloc.c:323)
==6955== by 0x80483D2: main (bla.c:5)
==6955== Address 0x418a02c is 0 bytes after a block of size 4 alloc'd
==6955== at 0x4022AB8: malloc (vg_replace_malloc.c:207)
==6955== by 0x80483C0: main (bla.c:3)
==6955==
==6955== ERROR SUMMARY: 1 errors from 1 contexts (suppressed: 11 from 1)
==6955== malloc/free: in use at exit: 4 bytes in 1 blocks.
==6955== malloc/free: 1 allocs, 1 frees, 4 bytes allocated.