WEB开发网
开发学院软件开发VC VC使用CRT调试功能来检测内存泄漏 阅读

VC使用CRT调试功能来检测内存泄漏

 2007-03-22 21:31:47 来源:WEB开发网   
核心提示: 例如,在本文例子代码的输出信息中,VC使用CRT调试功能来检测内存泄漏(5),“45”是内存分配序号,意思是泄漏的内存是你程序中分配的第四十五个内存块:Detected memory leaks!Dumping objects ->C:Tempmemleakm

例如,在本文例子代码的输出信息中,“45”是内存分配序号,意思是泄漏的内存是你程序中分配的第四十五个内存块:

Detected memory leaks!
Dumping objects ->
C:Tempmemleakmemleak.cpp(15) : {45} normal block at 0x00441BA0, 2 bytes long.
Data: <AB> 41 42
......
Object dump complete.

CRT 库对程序运行期间分配的所有内存块进行计数,包括由 CRT 库自己分配的内存和其它库(如 MFC)分配的内存。因此,分配序号为 N 的对象即为程序中分配的第 N 个对象,但不一定是代码分配的第 N 个对象。(大多数情况下并非如此。)这样的话,你便可以利用分配序号在分配内存的位置设置一个断点。方法是在程序起始附近设置一个位置断点。当程序在该点中断时,可以从 QuickWatch(快速监视)对话框或 Watch(监视)窗口设置一个内存分配断点:

例如,在 Watch 窗口中,在 Name 栏键入下面的表达式:

_crtBreakAlloc

如果要使用 CRT 库的多线程 DLL 版本(/MD 选项),那么必须包含上下文操作符,像这样:

{,,msvcrtd.dll}_crtBreakAlloc

现在按下回车键,调试器将计算该值并把结果放入 Value 栏。如果没有在内存分配点设置任何断点,该值将为 –1。

用你想要在其位置中断的内存分配的分配序号替换 Value 栏中的值。例如输入 45。这样就会在分配序号为 45 的地方中断。

在所感兴趣的内存分配处设置断点后,可以继续调试。这时,运行程序时一定要小心,要保证内存块分配的顺序不会改变。当程序在指定的内存分配处中断时,可以查看 Call Stack(调用堆栈)窗口和其它调试器信息以确定分配内存时的情况。如果必要,可以从该点继续执行程序,以查看对象发生了什么情况,或许可以确定未正确释放对象的原因。

上一页  1 2 3 4 5 6  下一页

Tags:VC 使用 CRT

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接