堆分配函数的“Debug”版本
更新:2007 年 11 月
本主题适用于:
版本 |
Visual Basic |
C# |
C++ |
Web Developer |
---|---|---|---|---|
速成版 |
仅限本机 |
|||
标准版 |
仅限本机 |
|||
专业团队版 |
仅限本机 |
表格图例:
适用 |
|
不适用 |
|
默认情况下隐藏的一条或多条命令。 |
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 类型的请求作为标准分配处理。