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