_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。有关更多信息,请参见 平台调用示例

请参见

参考

内存分配

_heapadd

_heapchk

_heapmin

_heapset