更新:2007 年 11 月
本主题适用于:
| 版本 | Visual Basic | C# | C++ | Web Developer | 
|---|---|---|---|---|
| 速成版 | .gif) | .gif) | 仅限本机 | .gif) | 
| 标准版 | .gif) | .gif) | 仅限本机 | .gif) | 
| 专业团队版 | .gif) | .gif) | 仅限本机 | .gif) | 
表格图例:
| .gif) | 适用 | 
| .gif) | 不适用 | 
| .gif) | 默认情况下隐藏的一条或多条命令。 | 
C 运行库包含堆分配函数的特殊“Debug”版本。这些函数的名称与发行版本相同,只是追加了“_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 类型的请求作为标准分配处理。