• [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.总结

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

    ~不再更新,都不让我写公式,博客园太拉胯了
  • 相关阅读:
    2015的最后一天
    网络类型IPv4和IPv6什么意思?区别?
    2:文档编辑生成目录相关方法说明
    TCP与UDP的区别
    vs 2012 InstallShield Limited Edition Project 打包windows服务解析
    百科编辑器ueditor应用笔记
    百度编辑器Ueditor 初始化加载内容失败解决办法
    矩阵-DirectX与OpenGL的不同
    ios系统中各种设置项的url链接
    简单的优化处理 By LINQ TO SQL
  • 原文地址:https://www.cnblogs.com/alimy/p/9673843.html
Copyright © 2020-2023  润新知