_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 関数は、プログラムのヒープ関連の問題をデバッグするのに役立ちます。 この関数はヒープを走査します。呼び出しごとに 1 つのエントリを走査し、次のヒープ エントリに関する情報を含んだ _HEAPINFO 型の構造体へのポインターを返します。 _HEAPINFO 型は Malloc.h で定義されており、次の要素を含んでいます。
int *_pentry
ヒープ エントリのポインター。size_t _size
ヒープ エントリのサイズ。int _useflag
ヒープ エントリが使用中かどうかを示すフラグ。
_HEAPOK を返す _heapwalk を呼び出すと、エントリのサイズが _size フィールドに格納され、_useflag フィールドが _FREEENTRY または _USEDENTRY (両方とも Malloc.h に定義されている定数です) に設定されます。 ヒープの最初のエントリに関する情報を取得するには、_pentry メンバーが NULL である _HEAPINFO 構造体へのポインターを _heapwalk に渡します。 オペレーティング システムが _heapwalk (たとえば、Windows 98) をサポートする、関数の戻り値 _HEAPEND は ENOSYSに errno を設定します。
この関数は、そのパラメーターを検証します。 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 を使用します。詳細については、「プラットフォーム呼び出しの例」を参照してください。