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

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

    ~不再更新,都不让我写公式,博客园太拉胯了
  • 相关阅读:
    在网页中实现截屏粘贴的功能
    CSS3 @font-face 做自定义图标
    Visual Studio报错一箩筐(持续更新)
    Axure实现vcg官网首页原型图
    Axure实现bootstrap首页线框图
    Web第一天——准备篇
    vue动态加载组件
    组件封装之将代码放到npm上
    node连接mysql生成接口,vue通过接口实现数据的增删改查(二)
    autoCAD2007 快捷键 标注
  • 原文地址:https://www.cnblogs.com/alimy/p/9673843.html
Copyright © 2011-2022 走看看