堆分配函数的调试版本
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
类型的请求作为标准分配处理。
另请参阅
反馈
https://aka.ms/ContentUserFeedback。
即将发布:在整个 2024 年,我们将逐步淘汰作为内容反馈机制的“GitHub 问题”,并将其取代为新的反馈系统。 有关详细信息,请参阅:提交和查看相关反馈