在具有给定内存分配号的全局内存中查找内存泄漏 我试图用VS 2019找出我的C++程序中的内存泄漏。 “调试输出”窗口中的输出内容如下: {3880} normal block at 0x00D66730, 8 bytes long. Data: < 5 > D8 35 0F 05 00 00 00 00

在具有给定内存分配号的全局内存中查找内存泄漏 我试图用VS 2019找出我的C++程序中的内存泄漏。 “调试输出”窗口中的输出内容如下: {3880} normal block at 0x00D66730, 8 bytes long. Data: < 5 > D8 35 0F 05 00 00 00 00,c++,memory-leaks,visual-studio-2019,C++,Memory Leaks,Visual Studio 2019,这将引出另一条信息: C:\Main.cpp(5) : {3944} normal block at 0x00D24BF8, 4 bytes long. Data: < > CD CD CD CD C:\Main.cpp(5):{3944}0x00D24BF8处的普通块,4字节长。 数据:CD 因此,内存分配号3880低于专用内存泄漏(3944)的内存分配号。 此信息是否允许我得出内存泄漏(内存分配号为3880)是由全局变量引起的结论? 还是仍然可能是由于DLL文件(或D

这将引出另一条信息:

C:\Main.cpp(5) : {3944} normal block at 0x00D24BF8, 4 bytes long.
 Data: <    > CD CD CD CD
C:\Main.cpp(5):{3944}0x00D24BF8处的普通块,4字节长。
数据:<>CD
因此,内存分配号3880低于专用内存泄漏(3944)的内存分配号。 此信息是否允许我得出内存泄漏(内存分配号为3880)是由全局变量引起的结论?
还是仍然可能是由于DLL文件(或DLL文件中的全局变量)导致的泄漏?

您可以添加一个监视条目
ucrtbased.DLL_crtBreakAlloc
。它的初始值是-1。但您可以将其设置为3880以请求在该分配处停止

不过,要在启动期间进行分配时达到这一点有点困难

  • 必须在
    ucrtbased.dll上设置函数断点!heap\u alloc\u dbg\u internal

  • 运行你的程序。它将在该功能处停止

  • 更改
    ucrtbased.dll的值_crtBreakAlloc
    至3880(您现在应该在手表窗口中有)

  • heap\u alloc\u dbg\u internal
    处禁用断点

  • 继续这个节目。观察您的程序在请求的分配时停止


  • 进入分配函数,直到找到分配计数器,然后创建一个条件断点,在达到计数时停止。这应该能准确地显示分配发生的位置。@j6t谢谢你的帖子。“allocation function”的意思是“vcruntime\u new.h”中的“inline void*\uuuuu CRTDECL operator new”吗?我找不到“分配计数器”。你有什么帮助吗?是的,我是说那个功能。尽可能使用上下文菜单“单步进入特定”,然后在调用堆栈窗口中,如果未加载,则使用上下文菜单“加载符号”;这将向您显示源代码。您最终应该得到一些类似malloc的函数。它看起来像是
    ucrtbased.dll中的
    heap\u alloc\u dbg\u internal
    ,要注意的变量名是
    request\u number
    \u acrt\u current\u request\u number
    。似乎有一个全局变量
    \u crtBreakAlloc
    ,可以设置为3880,它应该会在调试器中自动停止。我非常感谢您的回答!我会接受的。在你第一步的回答中。请将“heap\u alloc\u dbg\u internal”替换为“ucrtbased.dll!heap\u alloc\u dbg\u internal”?完成!尽管出于某种原因,没有它对我来说是有效的。
    C:\Main.cpp(5) : {3944} normal block at 0x00D24BF8, 4 bytes long.
     Data: <    > CD CD CD CD