_heapwalk
遍历堆并返回有关下项的信息。
重要
此 API 不能在运行时的窗口执行的应用程序,但在调试版本。有关更多信息,请参见 CRT 函数不支持与 /ZW。
int _heapwalk(
_HEAPINFO *entryinfo
);
参数
- entryinfo
包含堆信息的缓冲区。
返回值
_heapwalk 返回在 Malloc.h 定义的以下整数清单常数之一。
_HEAPBADBEGIN
无效或未找到的初始头信息。_HEAPBADNODE
堆损坏的或找到的错误节点。_HEAPBADPTR
_HEAPINFO 结构的_pentry 字段不包含有效的指向堆或 entryinfo 是一个 null 指针。_HEAPEND
已成功到达的堆的末尾。_HEAPEMPTY
未初始化的堆。_HEAPOK
目前没有错误;entryinfo 更新相关下堆项的信息。
此外,在中,如果发生错误,_heapwalk 设置 errno 到 ENOSYS。
备注
_heapwalk 功能帮助调试过程中的堆相关的问题。 函数通过堆遍历,遍历一项的每个调用,并返回指向包含有关下堆项的信息类型 _HEAPINFO 的结构。 _HEAPINFO 类型,定义在 Malloc.h,包含以下元素。
int *_pentry
堆项指针。size_t _size
堆项的范围。int _useflag
标记指示堆项是否正在使用的。
返回 _HEAPOK 存储项的大小 _size 字段并设置 _useflag 字段设置为 _FREEENTRY 或 _USEDENTRY (可 _heapwalk 的调用两者都在 Malloc.h 定义的常数)。 获取有关首先访问此信息在堆,通过 _heapwalk 指向 _pentry 成员是 NULL的 _HEAPINFO 结构。 如果操作系统不支持 _heapwalk(例如,Windows 98),则该函数返回 _HEAPEND 并将 errno 到 ENOSYS。
此功能验证其参数。 如果 entryinfo 是 null 指针,无效参数调用处理程序,如 参数验证所述。 如果执行允许继续,errno 设置为 EINVAL,函数返回 _HEAPBADPTR。
要求
实例 |
必需的标头 |
选项标头 |
---|---|---|
_heapwalk |
<malloc.h> |
<errno.h> |
有关更多兼容性信息,请参见中介绍的 兼容性。
示例
// crt_heapwalk.c
// This program "walks" the heap, starting
// at the beginning (_pentry = NULL). It prints out each
// heap entry's use, location, and size. It also prints
// out information about the overall state of the heap as
// soon as _heapwalk returns a value other than _HEAPOK
// or if the loop has iterated 100 times.
#include <stdio.h>
#include <malloc.h>
void heapdump(void);
int main(void)
{
char *buffer;
heapdump();
if((buffer = (char *)malloc(59)) != NULL)
{
heapdump();
free(buffer);
}
heapdump();
}
void heapdump(void)
{
_HEAPINFO hinfo;
int heapstatus;
int numLoops;
hinfo._pentry = NULL;
numLoops = 0;
while((heapstatus = _heapwalk(&hinfo)) == _HEAPOK &&
numLoops < 100)
{
printf("%6s block at %Fp of size %4.4X\n",
(hinfo._useflag == _USEDENTRY ? "USED" : "FREE"),
hinfo._pentry, hinfo._size);
numLoops++;
}
switch(heapstatus)
{
case _HEAPEMPTY:
printf("OK - empty heap\n");
break;
case _HEAPEND:
printf("OK - end of heap\n");
break;
case _HEAPBADPTR:
printf("ERROR - bad pointer to heap\n");
break;
case _HEAPBADBEGIN:
printf("ERROR - bad start of heap\n");
break;
case _HEAPBADNODE:
printf("ERROR - bad node in heap\n");
break;
}
}
.NET Framework 等效项
不适用。若要调用标准 C 函数,请使用 PInvoke。有关更多信息,请参见 平台调用示例。