使用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掉的内存会出现不可预知的结果。同时,如果出错,该错误可能不容易重现。这种是最恐怖的错误。

 

 

 

 

posted @ 2019-07-06 19:25  一匹夫  阅读(293)  评论(0编辑  收藏  举报