分配挂钩函数

每次分配、重新分配或释放内存时都会调用分配挂钩函数(挂钩函数使用 _CrtSetAllocHook 安装)。 该类型的挂钩可用于很多不同用途。 例如,可用它测试应用程序处理内存不足情况的方式,检查分配模式,或记录分配信息以供将来分析。

备注

注意有关在分配挂钩函数中使用 C 运行库函数的限制,详见“分配挂钩和 C 运行时内存分配”中的说明。

分配挂钩函数应有类似下面的原型:

int YourAllocHook(int nAllocType, void *pvData,
        size_t nSize, int nBlockUse, long lRequest,
        const unsigned char * szFileName, int nLine )

传递给 _CrtSetAllocHook 的指针为 _CRT_ALLOC_HOOK 类型,如 CRTDBG.H 中所定义:

typedef int (__cdecl * _CRT_ALLOC_HOOK)
    (int, void *, size_t, int, long, const unsigned char *, int);

当运行库调用您的挂钩时,nAllocType 参数指示将执行哪种分配操作(_HOOK_ALLOC_HOOK_REALLOC_HOOK_FREE)。 在释放或重新分配的情况下,pvData 包含指向将释放块的用户主题的指针。 但在分配情况下,该指针为空,因为分配尚未发生。 剩余的参数包含所讨论分配的大小、其块类型、与它关联的顺序请求编号,以及指向在其中进行分配的文件名和行号的指针(如果有)。 挂钩函数执行了其作者需要的所有分析及其他任务以后,必须返回 TRUE(指示分配操作可以继续)或 FALSE(指示分配操作应失败)。 该类型的简单挂钩可以检查迄今为止分配的内存量,如果该数量超出小限制,则返回 FALSE。 然后应用程序将经历分配错误,这种错误通常只会在可用内存极为不足时发生。 较复杂的挂钩可以跟踪分配模式,分析内存使用,或在特定情况发生时进行报告。

请参见

概念

分配挂钩和 C 运行时内存分配

其他资源

编写调试挂钩函数

crt_dbg2 Sample