zoukankan      html  css  js  c++  java
  • [C]安全释放堆内存

    1.在C语言的很多应用中常常需要使用malloc函数和free函数,为了防止内存泄漏和野指针的出现,需要在堆内存使用完毕后对指针指向的空间进行释放并对指针进行置零

      char*p = NULL;

      p = (char*)malloc(10*sizeof(char));

      .....

      if(p!=NULL)

      {

         free(p);

            p = NULL;

      }

    2.但当一次性需要malloc很多个不同类型的堆内存空间,需要检查和释放的时候,上面的代码在释放时得重复很多遍,代码看起来很内啥,需要用宏或者函数来统一释放,达到简短、实用和美观的效果。

    3.宏的方法

      #define SAFE_FREE(p)   

          if(p!=NULL)  

          {      

            free(p);  

            p = NULL;  

          }       

      需要释放时,每次用宏替换即可。

    3.函数通用方法

      int safe_free(void** p)

      {

        if(*p!=NULL)

        {

          free(*p);

          *p=NULL;

        }

      }

      这个代码在vs2015下,console exe工程中测试通过,但是这种void**两级空指针的用法,默认了当前环境下所有类型指针长度是一样的且各类二级指针引用方式一致,在嵌入式平台中,这种做法的移植性未必好。(部分嵌入式平台 指向code区、data区、xdata区的指针长度和访问方式各有不同)

    4.释放单一数据类型的方法

      int type_safe_free(type** p)

      {

        if(*p!=NULL)

        {

          free(*p);

          *p=NULL;

        }

      }

      缺点是每个类型都得写一个,麻烦。

    4.C++实现方法

      对于3中提到的缺点,C++使用函数模板即可。

    5.总结

      还是用宏替换解决吧,虽然只是替换,但保证了代码形式上的统一和美观,且没有移植性的障碍。

    ~不再更新,都不让我写公式,博客园太拉胯了
  • 相关阅读:
    【操作系统】第九章 虚拟内存
    【计网】第七章
    信息安全数学基础整理笔记
    深入浅出数据分析 笔记总结
    ERROR: Error cloning remote repo 'origin'
    Docker 操作
    centos 安装 git
    CentOS 7 安装 JAVA环境(JDK 1.8)
    如何删除 容器里的软件(彻底)
    Docker 部署 Jenkins :通过SSH配置Linux宿主机为slave节点,运行外部环境
  • 原文地址:https://www.cnblogs.com/alimy/p/9673843.html
Copyright © 2011-2022 走看看