C++内存泄漏,引起的原因有许多,不同的平台,所引起的原因也有差别,重点是如何追踪到内存泄漏所在的代码行,因为只要找到了问题,解决掉往往比泄漏定位要简单的多。
总结一下,定 位泄漏所在位置,哪个类,哪一行,主要用到两种方法:
Windebug 和VLD,两种方法各有各的优势,这里重点记述两者的操作方法:
其一:WIndebug 寻找法,
准备环境:安装Win10SDK,记得要启用WinDebugTools功能(在控制面板--》程序中修改,启用
Debugging Tools for Windows 功能
第二步,将Debug目录添加至环境变量中
C:\Program Files (x86)\Windows Kits\10\Debuggers\x64 //默认安装一般是这个目录,除非你更改了哦
第三步:配置批处理,设置程序目录,
@ECHO OFF
@REM 程序目录
SET APPDIR="D:\work_cpp\work_projects\MemDebug\x64\Debug"
@REM 软件名
SET APPNAME="MemDebug.exe"
@REM WinDbg目录
SET UMDH="C:\Program Files (x86)\Windows Kits\10\Debuggers\x64"
@REM 符号目录
SET SYMBOLS=""
SET _NT_SYMBOL_PATH=%APPDIR%;%SYMBOLS%;SRVd:\SymbolCachehttp://msdl.microsoft.com/download/symbols
SET PATH=%UMDH%;%PATH%
@REM 执行清理
DEL log.txt
DEL log1.txt
DEL log2.txt
@REM 开启用户堆
@REM gflags.exe /i %APPNAME% +ust
SET /P PID=[STEP1]请将目标程序启动并输入进程ID:
ECHO [STEP2]按下任意键开始第一次捕获
PAUSE
umdh.exe -p:%PID% -f:log1.txt
ECHO [STEP3]按下任意键开始第二次捕获
PAUSE
umdh.exe -p:%PID% -f:log2.txt
@REM 关闭用户堆
@REM gflags.exe /i %APPNAME% +ust
ECHO [STEP4]正在生成报表
umdh.exe log1.txt log2.txt -f:log.txt
notepad.exe log.txt
PAUSE
第四步,先后启动批处理和要跟踪的程序,输入程序的PID,(根据控制台窗口操作),
连续触发两次,就会抓取到内存泄漏所在的行
其二便是VLD 跟踪法,只有在开着编译器运程序,然后关闭程序的时候就会给出内存泄漏所在的行以及函数
关于VLD跟踪法,网上的教程很多,这里只记述一些注意的问题:
1:程序发布只能是以Debug模式进行,并且要带上dbghel.dll, vld_x64.dll,以及:
Microsoft.DTfW.DHL.manifest三个文件,放在exe同级目录下才有效果(Release模式试了跟踪不到)
2:VLD头文件必须放在第一行引用;
3:VLD的Debug库有两种MFC和QT,要注意不同的平台使用不同的库;