C/C++内存泄露及内存检测之我见

来源:互联网 发布:幼儿园大班美工课 编辑:程序博客网 时间:2024/06/09 16:55

引言 

相信很多在使用C/C++的人都或多或少的遇到过内存泄露的问题,因此如何消除内存泄露成了一个我们必修的课题,我个人认为,要在C/C++编程的时候消除内存泄露,需要做到如下几个方面:

  1. 良好的编程习惯,在应对一些有New/Malloc 以及调用一些创建对象的接口时需特别注意,如果一不小心,就容易产生内存泄露。
  2. 对于一些接口编写的程序员,需要注意的是如果接口中就返回内存对象的时候,需要将自己的接口足够清晰,要让上层使用者能够容易的意识到,需要后续的释放才能完成这些接口的使用。
  3. 求助于一些智能指针,这样就可以避免很多内存泄露的发生,我觉得这是一个非常使用的方法,值得大家借鉴和参考。
  4. 尽管我们可以做到上述这些,但是有时候我们似乎也不能完全避免内存泄露,这时候就该轮到我们的内存检测上场了,大部分情况下我们会求助于一些工具,我们接下来介绍。

 

  • Valgrind  ---一个Linux下非常好的动态内存检测工具(免费)

Valgrind的具体说明,请参考其官方网站http://valgrind.org/

在我最近的工作当中,我基本上就是用它来检测内存泄露,这个工具使用起来很简单,而且的确能够找到很多的内存泄露问题,非常值得推荐。

但是,使用的时候也需要注意方法以及技巧,我们刚刚说了这是一个动态的内存检测工具,也就是说它只能检测到能运行到的所有代码的内存泄露,并不能保证检测出那些未运行到的代码中的泄露,所以在使用的过程中,根据我的经验来说,需要首先在不使用这个工具的情况下重现出内存泄露,然后再使用这个工具执行相同的操作,这样就能保证泄露能够被找出来,要不然如果用工具去跑一些不存在泄露的case/scenario,其实无异于浪费时间。

  • VLD --- Windows下的动态内存检测工具(免费)

VLD 的具体说明,请访问http://www.codeproject.com/Articles/9815/Visual-Leak-Detector-Enhanced-Memory-Leak-Detectio

这是一个在Windows下的一个内存泄露的检测工具,这个工具比较小,使用起来很方便,而且原理比较简单,我认为是一个很好的工具,而且是免费的,相对于一些庞大而收费的内存检测工具,我觉得这个软件还是比较值得推荐的, 相对Valgrind来说,缺点就是需要重新编译代码来完成注入,但是缺点也可以变为优点,因为它的好处就是提供了很多的灵活性,这里就不一一对比了,还要看大家在平时工作中的实际使用对比。

 

好了,介绍完了两个收费的软件,该说说一些收费的软件了,其中比较好的当属IBM Rantional Purify 和BoundsCheck。

这两款软件自然也有它们的亮点,要不然也不会有人傻傻的去买这么贵的一个东西,它们除了能检测出内存泄露之外,还能检测出内存越界,非法访问等一系列内存问题。

 

在这里我们仅仅聊的是内存泄露,所以还是回到我们的话题,有些人可能会认为,既然收费的软件这么强大,那么是不是条件允许的情况下,应该先使用这些收费的工具来检测内存泄露,这种问题,笔者觉得见仁见智,但是,对于笔者来说,更倾向于先用上述免费的软件来查找问题,如果还是有内存的问题,再求助于这些庞大的软件,为什么呢? 因为这些免费的软件都很小,具有“小快灵”的特点,所以效率相对来说比较高一点。

这里给大家说一个实际的例子,我之前使用Purify的时候碰到这个这样的问题,我们的程序有好几百兆,运行起来,首先速度很慢,其实有时候在启动的过程当中会有很多莫名奇妙的错误,效率相当低下,这也是我的前车之鉴,跟大家一起分享,当然这个也需要根据自己的实际情况自己把握。

 

good luck

 

请大家多多指教

 

原创粉丝点击