对于内存泄漏的检查,其本质是在于对内存泄漏进行定位。而这种定位涵盖了两层意思:
一是定位模块,即哪个模块出了问题。
二是定位代码,即找到造成内存泄漏的代码。
鉴于此,于分工协作达成一个系统的情形之下,我们检查内存泄漏的相关工作流程应当是:其一,确定模块;其二,要是属于我们的模块产生问题,那就得确定代码。
有关内存泄漏的检查任务,似乎近似于一项侦探类工作。唯有寻觅到充足线索,方可找出真实缘由。若想成为一名出色侦探,个人自身的侦察本领最为关键。而那些优秀的侦探,通常会拥有一些优良侦探测工具。
那么,对于内存泄漏的检查工具,该以怎样的方式去评价其优劣呢?在这里,我们不妨开启想象:
1) 它可以自由选择监测的时间点;
2) 它能够attach随便某一个正在运行的进程,以此来追踪内存泄漏。
3) 我不需要在我的程序中加任何代码;
4) 没有源代码,我照样能发现内存泄漏的地方;
5) 我能得到每次分配内存,而未释放的堆栈情况。
6) 不管是发布版,还是调试版的程序,都能做到上面几点。
在这个位置,我进行推荐,要使用一个由MicroSoft公司自己所开展开发行为而得到的工具,它就是LeakDiag。
LeakDiag是个用于监测内存泄漏的工具,借助它能够精准地找出内存泄露直至代码行。它运用微软的Detours技术,拦截指定内存分配的调用,对各类调用栈予以跟踪,还要报告已分配却未释放的内存,这一信息能使我们在排查一处内存泄露问题时,精准查看是哪些组件进行了此分配。运用正确的调试符号,我们甚至能够瞧见请求分配的代码行。在对市面上各类内存泄漏检测工具进行比较后,我认为这个工具较好地达成了上面提及的6点。
LeakDiag支持5种不同的分配:
1) 虚拟的那种分配,它能够去追踪借助VirtualAlloc、VirtualAllocEx之类有关虚拟内存分配的内存,在这个时候,选择LeakDiag上。
Memory allocators
采用选项当中那个名为“Virtual Memory Allocator”的来实施检测。
2) 堆进行分配,这种分配能够追踪在NTDLL.DLL里如下函数所分配的内存。
· RtlCreateHeap,
· RtlDestroyHeap,
· RtlAllocateHeap,
· RtlFreeHeap,
· RtlReAllocateHeap,
· LocalReAlloc,
· LocalFree,
· LocalAlloc,
· LocalReAlloc,
· GlobalAlloc,
· GlobalReAlloc and
· GlobalFree
此时,选择LeakDiag 上
Memory allocators
通过选项之中的“Windows Heap Allocator”,展开检测。
3) 线程局部存储,也就是那种允许一个进程的多个线程去存储每个线程所独有的数据的Win32机制,它进行分配。这种分配能够追踪MSDART32.DLL中像下面这样的函数分配的内存。

· MPHeapAlloc,
· MPHeapFree and
· MPHeapReAlloc
此时,选择LeakDiag 上
Memory allocators
选项的“MPHeap Allocator”来检测。
4) COM进行分配,包括外部和内部的分配。这样的分配能够追踪在OLE32.DLL、OLEAUT32.DLL里如下函数所分配的内存。
· CoGetMalloc,
· CoTaskMemAlloc,
· CoTaskMemFree,
· CoTaskMemRealloc,
· CRetailMalloc_Alloc,
· CRetailMalloc_Free,
· CRetailMalloc_Realloc,
· SysAllocStringLen,
· SysAllocStringByteLen,
· SysAllocString,
· SysFreeString,
· SysReAllocString and
· SysReAllocStringLen
此时,选择LeakDiag 上
Memory allocators
选用选项之中的“COM Allocator”,或者借助“COM Internal Allocator”去进行检测。
5) C运行的时候进行分配,这样的分配能够去追踪MSVCRT.DLL里如下这些函数所分配的内存。
· malloc,
· calloc,
· realloc,
· free,
· new,
· new,
· delete and
· delete
此时,选择LeakDiag 上
Memory allocators
选项的“C Runtime Allocator”来检测。