Visual Leak Detector源于Code Project:Visual Leak Detector - Enhanced Memory Leak Detection for Visual C++, 安装包能够到 这里 下载。html
使用很简单,基本上安装完了就之能够直接用, 具体能够参考 这篇windows
关于对象句柄泄露, 主要分GDI对象,Kernel对象,User对象:工具
GDI对象只在本进程有效,主要是指Brush, Pen,DC等, 具体能够参考 这里spa
User对象只在同一Session内有效,同一user对象在不一样进程内值都相等,能够跨进程使用, 主要是指Menu, window, cursor, hook等,具体能够参考 这里.net
Kernel对象能够跨进程使用, 可是由于每一个进程都有本身的内核对象表,因此同一对象的句柄值在不一样进程里会不相等(尽管最终指向同一个内核对象),主要是指各种HANDLE,具体能够参考 这里code
对于对象句柄泄露,免费来讲没有太好的工具能够直接使用, 不少时候咱们能够直接经过任务管理器来观察各种对象的个数, 若是有持续增加, 则说明有泄露存在。不少时候GDI泄露是大头,咱们要判断哪类GDI对象正在泄露,能够考虑使用工具GDIView。(对于对象句柄泄露,谁有好的工具,能够提示下。)orm
对于内核对象泄露,咱们能够考虑使用WinDbg的 !htrace 命令, 使用很简单:经过 !htrace -enable 命令打开栈回溯, 而后经过 !htrace -snapshot 命令保存一个当前全部句柄的快照, 最后再经过 -htrace -diff 命令获取全部前面保存快照后打开但没有关闭的句柄对象。htm
若是公司有钱,能够考虑购买Boudcheck, 这个工具很是强大,能够帮咱们快速的检测出各种内存和对象泄露,包括API的参数错误等。思考Boundcheck的实现原理,实际上并不复杂,主要就是API Hook, 大概过程以下:对象
(1) 将注入对方进程blog
(2) 经过API Hook替代系统资源分配和释放相关的API, 而且记录调用栈
(3)最后检测没有释放的资源, 生成报表
这里有篇文章告诉你如何开发相似的工具:LeakMon - Track Handle leak, GDI Leak and Memory Leak in your Applications
固然尽管原理很简单,可是由于Windows的API种类繁多,而且在新版本中会常有增长, 要开发一个完整的工具也不是一件容易的事情。