До сегодняшнего дня я жил в убеждении, что вызов free()
на память освобождает его для дальнейшего размещения без каких-либо других модификаций. Особенно, учитывая этот SO вопрос, в котором четко указано, что free()
НЕ ОТПУСКАЕТ память.
Однако рассмотрим этот фрагмент кода (test.c):
#include<stdlib.h>
#include<stdio.h>
int main()
{
int* pointer;
if (NULL == (pointer = malloc(sizeof(*pointer))))
return EXIT_FAILURE;
*pointer = 1337;
printf("Before free(): %p, %d\n", pointer, *pointer);
free(pointer);
printf("After free(): %p, %d\n", pointer, *pointer);
return EXIT_SUCCESS;
}
Компиляция (как GCC, так и Clang):
gcc test.c -o test_gcc
clang test.c -o test_clang
Результат:
$ ./test_gcc
Before free(): 0x719010, 1337
After free(): 0x719010, 0
$ ./test_clang
Before free: 0x19d2010, 1337
After free: 0x19d2010, 0
Почему так? Я все время жил во лжи или я неправильно понял некоторые основные понятия? Или есть лучшее объяснение?
Некоторая техническая информация:
Linux 4.0.1-1-ARCH x86_64
gcc version 4.9.2 20150304 (prerelease) (GCC)
clang version 3.6.0 (tags/RELEASE_360/final)