Memory leaks 为什么_CrtSetBreakAlloc不会导致断点?

Memory leaks 为什么_CrtSetBreakAlloc不会导致断点?,memory-leaks,visual-c++,msvcrt,crtdbg.h,Memory Leaks,Visual C++,Msvcrt,Crtdbg.h,我使用的是来自的VisualCRT内存泄漏检测例程;当我调用\u CrtDumpMemoryLeaks时,每次调用程序时都会一致地报告一次分配: {133} normal block at 0x04F85628, 56 bytes long. Data: < > B0 81 F8 04 B0 81 F8 04 B0 81 F8 04 CD CD CD CD 我还可以在watch窗口中验证{,msvcr90d.dll}\u crtBreakAlloc

我使用的是来自
的VisualCRT内存泄漏检测例程;当我调用
\u CrtDumpMemoryLeaks
时,每次调用程序时都会一致地报告一次分配:

{133} normal block at 0x04F85628, 56 bytes long.
 Data: <                > B0 81 F8 04 B0 81 F8 04 B0 81 F8 04 CD CD CD CD 
我还可以在watch窗口中验证
{,msvcr90d.dll}\u crtBreakAlloc
确实设置为133。程序退出后,泄漏报告仍会列出#133(以及一些更高的数字),但不会出现断点。为什么会出现这种情况?如何使断点出现

潜在相关信息:

  • VS2008,使用“多线程调试DLL”CRT
  • 我的代码是由第三方产品加载的DLL
  • “正常”断点工作正常;踏实做工精细<代码>\uu asm int 3也可以正常工作
  • \u crtBreakAlloc
    的其他值也不会导致断点(不是我尝试的那些值)
  • #133是泄漏报告中的最低数字

  • 听起来你可能是用一个非调试库编译你的应用程序,例如,如果你使用的库的发布版本应该会破坏你的应用程序,它不会这样做。这可能是因为您使用了第三方应用程序。也有可能在运行时加载非调试dll而不是调试dll

    尝试查看在调试时是否为您的应用加载了正确的DLL,以及该应用或DLL是否已实际调试。(有时您必须显式地将dll或exe加载到调试器中。)


    这就是我所能想到的,没有看到更多关于这个的细节…

    主要的拍额头。。。一个“明显”的原因是,如果在设置断点之前发生分配#133

    只是第一次泄漏发生在调用DLL之前。事实上,这不一定是泄漏,因为我在卸载DLL时调用
    \u CrtDumpMemoryLeaks
    ,而不是在父应用程序完成反初始化时调用


    至于我最初的问题中的“潜在相关信息4”,我确实尝试了一些值,但不知何故没有一个值高于133…

    我认为,_CrtDumpMemoryLeaks工作的事实表明我正确地链接了调试CRT(不完全确定)。我已经仔细检查了第三方应用程序是否加载了正确的DLL调试版本。该应用程序本身就是一个“发布”应用程序。调试器肯定是附加的。我想这是在程序的最开始设置断点的好处,然后将{,msvcr90d.dll}u crtBreakAlloc设置为133,而不是调用_crtsetbreakaloc(133);虽然我不确定这句话是否适用于你的情况无论如何,很高兴它得到了解决。仅供参考,一种简单(也是常见)的方法是如果您的分配是静态的。例如,您在文件范围内创建了一个
    std::vector
    _CrtSetBreakAlloc(133);