查看原文
其他

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

程序喵大人 程序喵大人 2022-08-22

温馨提示:文末有福利,送大家现代C++白皮书,限量1000份。


作为程序员,特别是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,内存泄漏检测只是功能之一,更多功能大家可以自己去看看,确实不错。


打完收工。





送书


这本书是C++ 之 父 Bjarne Stroustrup 的 HOPL4 论文的中文版。这篇论文特别重要,因为它涵盖了 C++98 之后的所有 C++ 版本,从 C++11 直到 C++20。这些都是C++开发者一定要掌握的知识点,所以Boolan组织了一群译者,把这篇重要论文翻译成了中文,让 C++ 开发人员对 C++ 的设计原则和历史有一个系统的了解。吴咏炜老师是主要成员呢。感兴趣的可以扫码领取,限量1000份,先到先得哈。也可以点击阅读原文领取。




点个在看你最好看


您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存