直到今天,我一直相信在内存空间上调用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)
free
是C库的一部分,gcc
和clang
都在你的系统上使用glibc
。尝试分配一个大块的内存,而不是8字节,比如16MB,并查看是否解引用已释放的内存会导致崩溃。 - chqrlie