_heapwalk
遍历堆并返回有关下项的信息。
重要
此 API 不能用于在 Windows 运行时中执行的应用程序。除非调试时。有关详细信息,请参见 CRT functions not supported with /ZW(CRT 函数不支持使用/ZW)。
int _heapwalk(
_HEAPINFO *entryinfo
);
参数
- entryinfo
包含堆信息的缓冲区。
返回值
_heapwalk 返回在 Malloc.h 定义的以下整数清单常数之一。
_HEAPBADBEGIN
无效或未找到的初始头信息。_HEAPBADNODE
堆损坏或找到错误节点。_HEAPBADPTR
_HEAPINFO 结构的_pentry 字段不包含有效的堆指针或 entryinfo 是一个空指针。_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 是空指针,则会调用无效参数处理程序,如 参数验证 所述。 如果允许执行继续,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。有关更多信息,请参见平台调用示例。