使用free掉的内存的危害
1 源码
#include <stdio.h> #include <stdlib.h> // 编译环境 gcc int main(void) { printf("******** free test ********** \n"); printf("sizeof(uint) = %ld \n", sizeof(unsigned int)); unsigned int *pInt = (unsigned int*)malloc(sizeof(unsigned int)); printf("pInt = %p \n", pInt); pInt[0] = 0x88; printf("Int1 = %d \n", *pInt); // free该片内存 free(pInt); //free以后去读该内存 本质是非法的,不可靠的 printf("pInt = %p \n", pInt); unsigned int Int2 = *pInt; printf("Int2 = %d \n", Int2); //free以后去写该内存 本质是非法的,不可靠的 pInt[0] = 0x88; pInt[1] = 0x77; printf("pInt[0] = %d \n", *pInt); return 0; //本次实验代码没有暴露出使用free掉的内存的危害。 }
2小结
做了个实验,free以后的内存也可以读写。本次实验代码没有暴露出使用free掉的内存的底危害。
那么使用free掉的内存,程序员再去读写该内存,该操作的底危害在哪里?
关于用malloc分配的内存,在调用free释放后,该内存的状态,有以下几点说明:
1.调用free释放掉所分配的内存后,表明该内存可以被别人使用,也就是说,其他地方调用malloc后,可以分配到该内存。 既然其他地方malloc内存可能也使用了这片内存,所以里面的数据可能会被改写。
2.理解了第一点以后,那么关于free释放该内存后,该内存中的数据,我们只能认为是脏数据;也就是说,这部分数据可能存在并且维持原来的值,也可能被清空,或者也可能被被修改为了其他值;
由此可见,有很多中可能情况,所以,在释放了该内存后,除了要对当时分配的指针赋值为NULL,还要注意不要再去引用这部分内存,也不要尝试获取这部分的值,这些已经非法。
使用free掉的内存会出现不可预知的结果。同时,如果出错,该错误可能不容易重现。这种是最恐怖的错误。
/************* 社会的有色眼光是:博士生、研究生、本科生、车间工人; 重点大学高材生、普通院校、二流院校、野鸡大学; 年薪百万、五十万、五万; 这些都只是帽子,可以失败千百次,但我和社会都觉得,人只要成功一次,就能换一顶帽子,只是社会看不见你之前的失败的帽子。 当然,换帽子决不是最终目的,走好自己的路就行。 杭州.大话西游 *******/