堆分配函数的调试版本

C 运行时 (CRT) 库包含堆分配函数的特定调试版本。 这些函数的名称与发行版本相同,只是追加了 _dbg。 本文用 malloc_malloc_dbg 作为示例,描述 CRT 函数的发行版本和 _dbg 版本之间的差异。

调试版本中的行为

定义 _DEBUG 后,CRT 会将所有 malloc 调用映射到 _malloc_dbg。 因此,不需要用 _malloc_dbg 代替 malloc 来重写代码以获得调试时的好处。

但您可能希望显式调用 _malloc_dbg。 显式调用 _malloc_dbg 具有一些附加的好处:

  • 跟踪 _CLIENT_BLOCK 类型分配。

  • 存储分配请求所在的源文件和行号。

如果不希望将 malloc 调用转换为 _malloc_dbg,可以通过定义 _CRTDBG_MAP_ALLOC 来获取源文件信息,而这导致预处理器将对 malloc 的所有调用直接映射到 _malloc_dbg,而不是依赖 malloc 周围的包装器。

若要跟踪客户端块中各种类型的分配,必须直接调用 _malloc_dbg,并将 blockType 参数设置为 _CLIENT_BLOCK

非调试版本中的行为

未定义 _DEBUG 时,对 malloc 的调用将不受干扰,并且对 _malloc_dbg 的调用将被解析为 malloc,忽略 _CRTDBG_MAP_ALLOC 的定义,并且不提供与分配请求有关的源文件信息。 因为 malloc 没有块类型参数,所以将对 _CLIENT_BLOCK 类型的请求作为标准分配处理。

另请参阅

CRT 调试技术