orkspace\qt 5.9\qtdemo\testvld\main.cpp (6): testVLD.exe!testFun() + 0x7 bytes
e:\cworkspace\qt 5.9\qtdemo\testvld\main.cpp (17): testVLD.exe!main()
f:\dd\vctools\crt\vcstartup\src\startup\exe_common.inl (74): testVLD.exe!invoke_main() + 0x1B bytes
f:\dd\vctools\crt\vcstartup\src\startup\exe_common.inl (264): testVLD.exe!__scrt_common_main_seh() + 0x5 bytes
f:\dd\vctools\crt\vcstartup\src\startup\exe_common.inl (309): testVLD.exe!__scrt_common_main()
f:\dd\vctools\crt\vcstartup\src\startup\exe_main.cpp (17): testVLD.exe!mainCRTStartup()
KERNEL32.DLL!BaseThreadInitThunk() + 0x19 bytes
ntdll.dll!RtlGetAppContainerNamedObjectPath() + 0x11E bytes
ntdll.dll!RtlGetAppContainerNamedObjectPath() + 0xEE bytes
Data:
32 89 56 64 CD CD CD CD CD CD CD CD CD CD CD CD 2.Vd.... ........
CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD ........ ........
CD CD CD CD CD CD CD CD ........ ........
Visual Leak Detector detected 1 memory leak (76 bytes).
Largest number used: 76 bytes.
Total allocations: 76 bytes.
Visual Leak Detector is now exiting.
输出与上一节基本类似,这里提几个不同点:
第 4~5 行中,40 bytes
与代码请求的内存量大小相同,即 sizeof(int) * 10 = 40
。
第 8 行,表示 operator new[]()
函数中分配内存的代码位于 new_array.cpp
文件的第 15 行,这与前面的 operator new()
函数及 new_scalar.cpp
文件不同,实际使用时可以根据这一点来判断泄漏形式,是数组还是标量。
第 19~21 行,十六进制数 32 89 56 64
的十进制表示为 50 137 86 100
,其中 50 86 100
对应的 ASCII 字符分别为 2
、 V
、 d
,是可以输出显示的字符,但 137
超过了 127
,不属于 ASCII 标准字符集,属于 ASCII 扩展字符集,无法直接在界面上显示,因此仍以 "."
英文句点来代替,源码根据 isgraph()
返回值来判断是否可正常显示。此外,未初始化内存单个字节的值都为 CD
,对应的十进制数为 205
,这是 Microsoft's C++ debugging runtime library
自动初始化的结果。通常,在 Debug
模式下,MSVC
会把未初始化的栈内存全部填充成 0xCC
,当成字符串看就是”烫烫烫烫……“;同时会把未初始化的堆内存全部填充成 0xCD
,当成字符串看就是“屯屯屯屯……”。实际使用时可以根据这一点来判断是否对泄漏内存赋了初始值。关于 0xCD
这一特殊十六进制数,更详细的可以查看以下资料,国内可能无法直接访问:
第 24~26 行中,76 bytes
包含有申请 int[10]
的 40 bytes
,和管理块占用的 36 bytes
。