1. 内存泄漏
内存泄漏:指由于疏忽或错误造成程序未能释放已经不再使用的内存的情况。内存泄漏并非指内存在物理上的消失,而是应用程序分配某段内存后,由于设计错误,失去了对该段内存的控制,因而造成了内存的浪费。
2.内存泄漏危害
最直接的危害就是系统内存耗尽,系统死机。内存泄漏是最难发现的常见错误之一,因为除非用完内存或调用 m a l l o c malloc malloc失败,否则都不会导致任何问题。如果程序运行时间足够长,如后台进程运行在服务器上,只要服务器不宕机就一直运行,一个小小的失误也会对程序造成重大的影响,如造成某些关键服务失败。
3.C++没有垃圾回收机制,我们需要关注那些类型的内存泄漏?
- 堆内存泄漏。在内存中程序员手动分配的一块内存, m a l l o c malloc malloc\ r e a l l o c realloc realloc\ n e w new new。完成相关操作后,没有调用相对应的 f r e e free free\ d e l e t e delete delete释放掉内存,这时这块内存就会常驻内存,造成堆内存泄漏
- 系统资源泄漏。分配给程序使用的资源没有使用相应函数释放,如 b i t m a p bitmap bitmap\ h a n d l e handle handle\ s o c k e t . socket. socket.
4.内存泄漏排查
- B o u n d s C h e c k e r BoundsChecker BoundsChecker,定位运行时发生的各种错误
- 调试运行 D E B U G DEBUG DEBUG版程序,运用以下技术: C R T CRT CRT( C C C r u n − t i m e run-time run−time l i b r a r i e s libraries libraries)、运行时函数调用堆栈、内存泄漏时提示的内存分配序号(集成开发环境OUTPUT窗口),综合分析内存泄漏的原因,排除内存泄漏。
- l i n u x linux linux工具之检测内存泄漏- v a l g r i n d valgrind valgrind,功能强大,不仅仅是内存泄漏检测工具。
5.怎样有效解决内存泄漏问题?
5.1 智能指针
因为智能指针可以自动删除分配的内存。智能指针和普通指针类似,只是不需要手动释放指针,而是通过智能指针自己管理内存的释放。
5.2 良好的编程习惯
尽量在涉及内存的程序段,检测出内存泄露。当程式稳定之后,在来检测内存泄露时,无疑增加了排除的困难和复杂度。
使用了内存分配的函数,要记得要使用其想用的函数释放掉,一旦使用完毕。
- H e a p Heap Heap m e m o r y memory memory
成对使用:
分配函数 | 释放函数 |
---|---|
m a l l o c malloc malloc/ r e a l l o c realloc realloc | f r e e free free |
n e w / n e w [ ] new/new[] new/new[] | d e l e t e delete delete/ d e l e t e [ ] delete[] delete[] |
G l o b a l A l l o c GlobalAlloc GlobalAlloc | G l o b a l F r e e GlobalFree GlobalFree |
要特别注意数组对象的内存泄露
int *ptr =new int[100];
其删除形式为:delete []ptr;
- R e s o u r c e Resource Resource L e a k Leak Leak
对于系统资源使用之前要仔细看起使用方法,防止错误使用或者忘记释放掉系统资源。
对于资源,也可使用 R A I I RAII RAII, R A I I RAII RAII( R e s o u r c e Resource Resource a c q u i s i t i o n acquisition acquisition i s is is i n i t i a l i z a t i o n initialization initialization)资源获取即初始化,它是一项很简单的技术,利用 C + + C++ C++对象生命周期的概念来控制程序的资源,例如内存,文件句柄,网络连接以及审计追踪( a u d i t audit audit t r a i l trail trail)等. R A I I RAII RAII的基本技术原理很简单.若希望保持对某个重要资源的跟踪,那么创建一个对象,并将资源的生命周期和对象的生命周期相关联。利用 C + + C++ C++的对象管理管理资源.