内存泄漏定位以及解决

Posted perfy576

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了内存泄漏定位以及解决相关的知识,希望对你有一定的参考价值。

1 内存泄漏定位

1.1 valgrind 

Valgrind包含下列工具:

  • memcheck:检查程序中的内存问题,如泄漏、越界、非法指针等。
  • callgrind:检测程序代码的运行时间和调用过程,以及分析程序性能
  • cachegrind:分析CPU的cache命中率、丢失率,用于进行代码优化。
  • helgrind:用于检查多线程程序的竞态条件
  • massif:堆栈分析器,指示程序中使用了多少堆内存等信息。

通过valgrand --tool=name 程序名来分别调用的

Memcheck:  最常用的工具,用来检测程序中出现的内存问题,所有对内存的读写都会被检测到,一切对malloc、free、new、delete的调用都会被捕获。

  • 对未初始化内存的使用
  • 读/写释放后的内存块
  • 读/写超出malloc分配的内存块
  • 读/写不适当的栈中内存块
  • 内存泄漏,指向一块内存的指针永远丢失
  • 不正确的malloc/free或new/delete匹配

1.2 观察内存

随着程序的运行内存不断增长,根据情况判断是否泄漏。

2 避免内存泄漏

2.1 良好的编码习惯

使用malloc分配的内存,要调用free释放

malloc\realloc ------  free

new \new[] ----------  delete \delete[]

2.2 使用RAII管理资源-资源获取即初始化

本质上说就是将内存的获取放在构造函数,将内存的释放放在析构函数。主要是避免了忘记free或是delete。但是如果没有在析构函数中释放资源,那么RAII也是没多大用处的。

2.3 share_ptr来管理内存

类似于GC了

 

以上是关于内存泄漏定位以及解决的主要内容,如果未能解决你的问题,请参考以下文章

一个线程内存泄漏问题定位过程

C/C++ 内存泄漏-原因避免以及定位

网页内存泄漏的方案定位分析解决

如何定位和解决Android的内存溢出问题(大总

哪些操作会造成内存泄漏以及如何解决内存泄漏

利用jemalloc分析内存泄漏以及LD_PRELOAD--转载--可以为定位内存问题的雏形