• 使用free掉的内存的危害


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

    /************* 社会的有色眼光是:博士生、研究生、本科生、车间工人; 重点大学高材生、普通院校、二流院校、野鸡大学; 年薪百万、五十万、五万; 这些都只是帽子,可以失败千百次,但我和社会都觉得,人只要成功一次,就能换一顶帽子,只是社会看不见你之前的失败的帽子。 当然,换帽子决不是最终目的,走好自己的路就行。 杭州.大话西游 *******/
  • 相关阅读:
    VS安装部署
    C#与C/C++的交互
    3、C#入门第3课
    登录接口,猜年龄
    安装sql server 2016 always on配置dtc支持时遇到的问题
    购物车第一版
    Oracle patch查看路径
    innobackup增量备份脚本
    在vmware workstation下安装linux6关闭防火墙
    线程池-连接池-JDBC实例-JDBC连接池技术
  • 原文地址:https://www.cnblogs.com/happybirthdaytoyou/p/11143847.html
Copyright © 2020-2023  润新知