一、内存泄漏(memory leak)
1.内存泄漏定义:
申请的内存空间没有被正确释放,导致后续程序里这块内存被永远占用(不可达/无法访问),而且指向这块内存空间的指针不再存在时,这块内存也就永远不可达了,内存空间就这么一点点被蚕食
2.内存泄漏的后果?
少量的内存泄漏可能不会对程序产生影响,但是随着量的累计,程序的性能会逐渐降低。 更糟的是,泄漏的程序可能会用掉太多内存,以致另一个程序失败,而使用户无从查找问题的真正根源。
3.内存泄漏的种类:
(1)堆内存泄漏 (Heap leak)。程序员按需动态申请内存时通过malloc,realloc new从堆中分配得到内存,完成后必须通过调用对应的 free或者delete 删掉。如果没有释放掉,那么这块内存会无法使用,就会产生Heap Leak.
(2)系统资源泄露(Resource Leak)。主要指程序使用系统分配的资源比如 Bitmap,handle ,SOCKET等没有使用相应的函数释放掉,导致系统资源的浪费,严重可导致系统效能降低,系统运行不稳定。
4.使用C/C++语言开发的软件在运行时,出现内存泄漏。可以使用以下三种方式,进行检查排除:
(1)使用工具软件BoundsChecker,BoundsChecker是一个运行时错误检测工具,它主要定位程序运行时期发生的各种错误。
(2) 调试运行DEBUG版程序,运用以下技术:CRT(C run-time libraries)、运行时函数调用堆栈、内存泄漏时提示的内存分配序号(集成开发环境OUTPUT窗口),综合分析内存泄漏的原因,排除内存泄漏。
(3)Valgrind是一套Linux下,开放源代码(GPL V2)的仿真调试工具的集合。Valgrind由内核(core)以及基于内核的其他调试工具组成。
5.解决内存泄漏最有效的办法就是使用智能指针(Smart Pointer)。
二、内存溢出(memory overflow )
内存溢出就是内存越界。内存越界有一种很常见的情况是调用栈溢出(即stackoverflow),虽然这种情况可以看成是栈内存不足的一种体现。但内存溢出并不一定跟内存分配有什么关系,因为还有一种情况是缓冲区溢出。