如何调试内存泄漏?方法论来了

存储 存储软件
既然是调试,那就得用上工具,调试内存泄漏的工具有很多,最经典的就是valgrind和Asan,valgrind非常好用,但是在移动端不太好用,特别是Android,移植起来非常困难,而且还要sudo权限。

[[433453]]

作为程序员,特别是C/C++程序员,内存泄漏问题是必须要迈过的一座大山,那,

  • 写代码时如何避免内存泄漏?
  • 出现内存泄漏后,如何调试?

直奔主题!

01内存如何避免内存泄漏?

谁也不能永远保证自己的代码没有内存泄漏,这里我只能给出几点建议:

  • 充分利用RAII:考虑使用智能指针,关于智能指针是否应用使用,相信有人听身边的大佬说过不建议使用使用智能指针,可能是个带刺的玫瑰?不过在我短暂的C++开发生涯里,我还没有被智能指针坑过,而且用起来还特别方便,因为它真的能够降低出现内存泄漏的概率。至于那些大佬们的不同声音,我更倾向于Bjarne Stroustrup和Scott Meyers这些大佬们的意见,他们都建议使用智能指针,那我等小辈跟随就完事了。
  • 谁申请谁释放:如果没有使用智能指针,或者有些情况下没办法使用智能指针,那我们最好遵循一个原则,即谁申请谁释放原则。A这里申请的内存尽量在A这里释放,不要A申请内存,然后跑到B里释放,这种代码不直观,一不利于排查问题,二很容易稍微一点疏忽就导致内存泄漏。
  • 确保配对使用:new/delete,new[]/delete[]一定要配对使用,不配对使用大概率会出问题。这里推荐看下new[]和delete[]一定要配对使用吗?
  • 小空间优先使用栈内存:一般内存泄漏都是指堆内存泄漏,我们不申请堆内存,它自然就不会泄漏。

附加:这里还有个有效避免内存泄漏的方案,就是手撸一个内存泄漏检测器,在Debug模式下可以考虑开启它,程序运行一遍后,如果有内存泄漏,会精确指出是在哪里出现的泄漏。关于内存泄漏检测器可以移步到这里:我撸了个内存泄漏检测工具,只用了两招,其实原理就是重载operator new和operator delete。

02如何调试内存泄漏?

既然是调试,那就得用上工具,调试内存泄漏的工具有很多,最经典的就是valgrind和Asan,valgrind非常好用,但是在移动端不太好用,特别是Android,移植起来非常困难,而且还要sudo权限。而Asan就好多了,在哪里都能用,关于Asan我之前写文章介绍过,可以看这里:Linux如何调试内存泄漏。

然而如果是在移动端,我还发现了一个好用的开源库:https://github.com/tencent/matrix

这是一个腾讯出品的性能剖析工具,适用于Android和iOS,内存泄漏检测只是功能之一,更多功能大家可以自己去看看,确实不错。

 

打完收工。

 

责任编辑:武晓燕 来源: 程序喵大人
相关推荐

2022-06-27 08:47:29

BEM修饰符元素

2013-12-25 09:50:27

华为马悦企业业务

2011-01-14 17:00:11

Linux内存泄露

2009-03-16 13:43:14

2023-02-22 08:15:13

压测模拟计算

2020-10-12 07:57:42

技术架构制图

2020-04-16 08:45:03

架构应用逻辑方法论

2015-03-27 09:31:01

2015-08-12 17:06:28

2022-08-22 11:45:59

架构技术

2023-11-20 07:10:48

用户分析聚类算法

2023-12-18 10:45:23

内存泄漏计算机服务器

2021-08-09 09:54:37

内存泄漏JS 阿里云

2021-08-05 15:28:22

JS内存泄漏

2020-08-17 08:39:36

API监控

2016-11-17 10:46:10

2018-02-01 13:22:50

数据库MySQL同步延迟

2022-02-25 08:06:48

架构

2014-03-14 10:07:09

极限编程敏捷开发

2013-11-11 18:19:44

信息时代知识工程
点赞
收藏

51CTO技术栈公众号