1 源码
#include <stdio.h> #include <stdlib.h> // 编译环境 gcc int main(void) { printf("******** free test ********** "); printf("sizeof(uint) = %ld ", sizeof(unsigned int)); unsigned int *pInt = (unsigned int*)malloc(sizeof(unsigned int)); printf("pInt = %p ", pInt); pInt[0] = 0x88; printf("Int1 = %d ", *pInt); // free该片内存 free(pInt); //free以后去读该内存 本质是非法的,不可靠的 printf("pInt = %p ", pInt); unsigned int Int2 = *pInt; printf("Int2 = %d ", Int2); //free以后去写该内存 本质是非法的,不可靠的 pInt[0] = 0x88; pInt[1] = 0x77; printf("pInt[0] = %d ", *pInt); return 0; //本次实验代码没有暴露出使用free掉的内存的危害。 }
2小结
做了个实验,free以后的内存也可以读写。本次实验代码没有暴露出使用free掉的内存的底危害。
那么使用free掉的内存,程序员再去读写该内存,该操作的底危害在哪里?
关于用malloc分配的内存,在调用free释放后,该内存的状态,有以下几点说明:
1.调用free释放掉所分配的内存后,表明该内存可以被别人使用,也就是说,其他地方调用malloc后,可以分配到该内存。 既然其他地方malloc内存可能也使用了这片内存,所以里面的数据可能会被改写。
2.理解了第一点以后,那么关于free释放该内存后,该内存中的数据,我们只能认为是脏数据;也就是说,这部分数据可能存在并且维持原来的值,也可能被清空,或者也可能被被修改为了其他值;
由此可见,有很多中可能情况,所以,在释放了该内存后,除了要对当时分配的指针赋值为NULL,还要注意不要再去引用这部分内存,也不要尝试获取这部分的值,这些已经非法。
使用free掉的内存会出现不可预知的结果。同时,如果出错,该错误可能不容易重现。这种是最恐怖的错误。