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