内存泄漏
- - CSDN博客系统运维推荐文章程序申请了堆空间,但是“忘记”释放,导致该块区域在程序结束前无法被再次使用导致的. 泄漏时间长了,就会导致用户空间内存不足,严重的导致死机. 如果泄漏比较严重,很容易察觉;但是有些泄漏很缓慢,不容易察觉,但是软件会运行很长时间后,会慢慢导致严重问题,而且当发现症状的时候,基本上已经是比较晚的时候了,想要识别泄漏,还是可以实现的,本篇文章来聊聊内存操作的原理.
这个命题有些诡异,因为shared_ptr设计的初衷就是为了防止内存泄漏,但是先别急,等我把问题描述清楚.
事出缘由是这几天项目出现一个内存泄漏的bug,之前这部分是使用shared_ptr封装了很多指针的操作,后来出于效率的考虑,改回了裸指针.由于我们使用的google tcmalloc做内存分配,它自带了检测内存泄漏的功能,于是在单元测试的时候就被检查出了内存泄漏.
我想说,这其实是一件好事.
使用shared_ptr只不过是负责在这个指针的引用计数为0时自动释放这个指针,但是问题在于,如果一个指针的使用有误(比如上面的情况),导致了引用计数一直大于0而没有被释放,其实和内存泄漏无异.只不过,使用了shared_ptr之后,它在程序退出的时候自己帮你释放了这些本质上已经”泄漏”的内存,反而把问题掩盖住了.
所以,我的观点是,shared_ptr的使用要谨慎,一方面是效率问题,另方面shared_ptr具有病毒式的传递性,一个模块使用了它,与之相应的模块都要同时使用shared_ptr,这些都是别的问题了.而在shared_ptr最该关注的内存泄漏问题上,它的这种机制实际上掩盖了可能出现的问题–因为它只管回收内存,什么时候回收,什么该回收的反而没有回收,它无从知晓.
那么,如何防止内存呢?使用工具+完善单元测试(比如tcmalloc等).你可以借助工具去检测,但是最好不要在自己的代码中引入新的概念比如shared_ptr去做,作为C\C++程序员,内存分配管理是无论如何都不能避开的问题.
所以,引出我的另个观点,软件开发中,引入一些似乎取巧的方式,其实是掩盖了真实出现的问题.出来混,迟早都要还的.早点面对,少一些抽象层,我觉得是个好事.