1.内存泄漏
1.1 概念
内存泄漏指因为疏忽或错误造成程序未能释放已经不再使用的内存的情况。内存泄漏并不是指内存在物理上的消失,而是应用程序分配某段内存后,因为设计错误,失去了对该段内存的控制,因而造成了内存的浪费。
1.2 内存泄漏的危害
长期运行的程序出现内存泄漏,会使程序占用的内存一直增加,最后就会出现内存耗尽而导致宕机。
2.内存泄露的分类
对于C/C++来说一般会出现的内存泄露就是下面这两种:
(1)堆内存泄漏
堆内存指的是程序执行中依据须要分配通过malloc / calloc / realloc / new等从堆中分配的一块内存, 用完后必须通过调用相应的 free或者delete 删掉。假设程序的设计错误导致这部分内存没有被释放,那 么以后这部分空间将无法再被使用,就会产生Heap Leak。
(2)系统资源泄露
指程序使用系统分配的资源,比方套接字、文件描述符、管道等没有使用对应的函数释放掉,导致系统 资源的浪费,严重可导致系统效能减少,系统执行不稳定。
3.内存泄露的预防
既然我们已经知道了内存泄漏的危害,那我们该怎么预防,接下来就说一下预防吧!
1、良好的设计规范,养成良好的编码规范,申请的内存空间一定要去释放。
2、采用智能指针来管理资源
3、出问题了使用内存泄露检测工具。
4.内存泄漏的检查
对于内存泄漏的检测,我们直说windows版本。
(1)利用函数
1、在程序中包含以下代码(顺序不能变)
#define _CRTDBG_MAP_ALLOC
#include <stdlib.h>
#include <crtdbg.h>
通过包括 crtdbg.h,将 malloc 和 free 函数映射到它们的调试版本即 _malloc_dbg 和 _free_dbg,这两个函数将跟踪内存分配和释放
2、在添加了上述语句之后,可以通过在程序中包括以下语句(通常应恰好放在程序退出位置之前)来转储内存泄漏信息。
_CrtDumpMemoryLeaks();
(2)利用外部工具(VLD)
VLD(Visual LeakDetector)作用:
1)可以得到内存泄漏点的调用堆栈,
2)可以得到泄漏内存的完整数据;
3)恶意设置内存泄漏报告的级别;
4)它以动态库的形式提供,无需编译源代码,只需要很小的改动程序;
VLD简单易用,唯一需要修改的地方就是添加#include VLD头文件,然后运行程序就可以发现内存问题了。这个就在这不详细介绍了。
5.内存泄漏解决方法
1、事前预防型。如智能指针等。
2、事后查错型。如泄漏检测工具。
对于内存泄漏这些问题,我现在只了解到这么多,等遇到之后再加。内存泄漏这是一个很重要的问题,在以后的学习中也会遇到很多。