_heapwalk
힙이 통과하고 다음 항목에 관한 정보를 반환합니다.
중요
이 API는 Windows 런타임에서 실행되는 응용 프로그램에서 사용할 수 없습니다.자세한 내용은 /ZW에서 지원하지 않는 CRT 함수를 참조하십시오.
int _heapwalk(
_HEAPINFO *entryinfo
);
매개 변수
- entryinfo
힙 정보를 포함하는 버퍼입니다.
반환 값
_heapwalk 는 Malloc.h에 정의된 다음 정수 매니페스트 상수 중 하나를 반환 합니다.
_HEAPBADBEGIN
초기 헤더 정보가 잘못 됬거나 없습니다._HEAPBADNODE
힙 손상 또는 잘못된 노드를 찾을 수 있습니다._HEAPBADPTR
_HEAPINFO 의 _pentry 필드 구조는 힙에 대한 유효한 포인터를 포함합니다. 또는 entryinfo 은 null 포인터입니다._HEAPEND
힙 끝에 성공적으로 도달 했습니다._HEAPEMPTY
힙은 초기화되지 않습니다._HEAPOK
지금까지 에러가 없다면 ; entryinfo 은 다음 힙 항목에 대한 정보를 업데이트합니다.
게다가, 오류가 발생 한 경우 _heapwalk 은 errno 를 ENOSYS설정합니다.
설명
_heapwalk 함수는 프로그램에서 디버그 힙 관련 문제를 돕습니다. 함수는 호출당 하나의 항목을 탐색하는 힙을 보여줍니다. 그리고 다음 힙 항목에 관한 정보가 들어 있는 _HEAPINFO 의 형식 구조에서 포인터를 반환합니다. Malloc.h에 정의된 _HEAPINFO 형식은 다음과 같은 요소를 포함합니다.
int *_pentry
힙 항목 포인터입니다.size_t _size
힙 항목의 크기입니다.int _useflag
노드가 사용 중인지 여부를 나타내는 플래그입니다.
_HEAPOK 를 반환하는 _heapwalk 호출은 _size 필드에서 항목 크기를 저장합니다. 그리고 _useflag 필드는 _FREEENTRY 또는 _USEDENTRY (둘 다 Malloc.h에 정의 된 상수)를 설정합니다. 힙에있는 첫번쨰 항목에 관한 정보를 얻기 위하여, _heapwalk 는 _HEAPINFO 구조를 통과합니다. _pentry 는 NULL을 멤버로 갖습니다. 운영 체제를 지원 하지 않는 경우, _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를 사용합니다. 자세한 내용은 플랫폼 호출 예제를 참조하십시오.