[C]安全释放堆内存

Posted alimy

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[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.总结

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

 

以上是关于[C]安全释放堆内存的主要内容,如果未能解决你的问题,请参考以下文章

JNA/ByteBuffer 没有被释放并导致 C 堆内存不足

如何为二维数组分配和释放堆内存?

释放堆内存后将指针设置为 NULL [重复]

C基础作用域和内存管理

智能指针--转

智能指针