内存泄露的分析方法总结

1.测试工具

目前使用的是原生valgrind,qt虽然自带valgrind但是报告内容不够全面且不利于生成报告,故暂时没有作为主力。
valgrind的功能多样,可以自行配置参数,定制化生成报告也更有针对性,qt的valgrind是窗口化,相对来说更加直观也更便捷,可以qt-valgrind测试完成后,再用原生valgrind。更加保险,开发效率性价比更高。

2.常见泄露情况

2.1内存没有释放

2.1.1检查new-delete是否配对出现

2.1.2检查malloc-free是否配对出现

2.1.3检查存储结构(顺序或链式)是否被全部释放

  • 逻辑检查
  • qt的Debug模式下检查
  • 打印检查

2.1.4二维结构/多维结构释放

  • 检查内层释放逻辑
  • 检查内层debug下数据
  • 检查是否释放外层

2.2内存没有被管理

  • 创建的对象的指针没有被作为返回值返回
  • 创建的对象的指针没有作为参数返回(此时参数通常表达为 A* &param或A** &param,可类推)

2.3内存二次使用

  • 类内对象创建前检查

为了避免类内成员出现二次使用问题,应当在构造函数或者创建成员对象函数中增加检查,例如指针不为空才进行创建,否则先要对对象进行销毁,然后在进行创建。
毕竟使用者是可以连续多次调用创建接口。此时最后一次创建之前的所有创建对象的指针都将丢失,形成野指针。

结语:
关于内存初始化也应当找个机会整理一下,避免出现无法稳定复现的bug。
今天是new了一个数组,发现数组内的初值并不是全是0。后来补上了memset就ok了。

猜你喜欢

转载自blog.csdn.net/sinat_21699465/article/details/117823735