Это дает мне точное поведение, которое я ожидал при запуске через Valgrind:
==8839== Invalid free() / delete / delete[]
==8839== at 0x4024836: free (vg_replace_malloc.c:325)
==8839== by 0x8048440: main (boom.c:10)
==8839== Address 0xbe9a5164 is on thread 1's stack
Я сделал это, потому что мне было любопытно, так как некоторые сообщали о том же поведении.
Адресp
(как разыменовано free()
) - это то, что известно как висячий указатель, поэтому любая операция над ним не определена.Я скомпилировал без оптимизации (-O0) и с отладочными символами (-g), чтобы получить лучшую иллюстрацию, но она взорвалась, несмотря ни на что.
При нормальной работе программы, как и ожидалось, просто возникает ошибка сегментации.Программа фактически завершается при профилировании в valgrind (дополнительные жалобы, когда printf()
также разыменовывает взрывной указатель):
==8839== Use of uninitialised value of size 4
==8839== at 0x8048445: main (boom.c:11)
==8839==
The values of p and q are 20 and 459916161
==8839==
==8839== HEAP SUMMARY:
==8839== in use at exit: 0 bytes in 0 blocks
==8839== total heap usage: 0 allocs, 1 frees, 0 bytes allocated
Но только потому, что Valgrind перехватывает SEGV.
Неопределенное поведение простоэто, неопределенное.Это одна из главных причин страшного «вау, работает на моей машине!»ошибка:)