【问题标题】:Checking heap integrity when _DEBUG is not defined?未定义 _DEBUG 时检查堆完整性?
【发布时间】:2026-02-02 19:40:02
【问题描述】:

我希望创建一个项目的构建,使其与发布构建相同,除了使用默认分配器的调试版本(对 alloc/free 等进行金丝雀检查)。编译器/CRT 是 Visual Studio 2010。

阅读 CRT 的文档,似乎需要定义 _DEBUG 以便不删除对 _CrtCheckMemory()、_malloc_dbg() 等的调用。我不希望启用 _DEBUG 定义,因为这将影响比分配器更多。

有没有办法在不定义 _DEBUG 的情况下使用 CRT 调试分配器?

【问题讨论】:

    标签: c++ visual-studio memory-management malloc msvcrt


    【解决方案1】:

    _malloc_dbg() 需要调试运行时,调试运行时需要_DEBUG - 所以不,你不能这样做。

    【讨论】:

    • 好的。所以它要么是_DEBUG(可能启用了优化),要么是滚动我自己的堆检查......
    • @Viktor:是的,或者使用一些外部工具 - 参见例如*.com/questions/413477/…
    【解决方案2】:

    您可以找出定义 _DEBUG 时使用的 malloc 调用的名称,然后手动定义 malloc 来使用它吗?

    如果您使用 c++,则与 new 相同,您可以为调试版本创建全局覆盖

    【讨论】:

    • 行不通。如前所述,_malloc_dbg 是调试运行时的一部分 - 使用调试运行时而不定义 _DEBUG 将会中断。