_heapwalk

ヒープを走査し、次のエントリに関する情報を返します。

重要

この API は、Windows ランタイムで実行するアプリケーションでは使用できません。ただし、デバッグ ビルドの場合は除きます。 詳細については、「ユニバーサル Windows プラットフォーム アプリでサポートされていない CRT 関数」を参照してください。

構文

int _heapwalk( _HEAPINFO *entryinfo );

パラメーター

entryinfo
ヒープ情報を格納するバッファー。

戻り値

_heapwalk は、Malloc.h に定義されている次の整数のマニフェスト定数のいずれかを返します。

戻り値 説明
_HEAPBADBEGIN 初期ヘッダー情報が無効または見つかりません。
_HEAPBADNODE ヒープが破損しているか、不適切なノードが見つかりました。
_HEAPBADPTR _pentry構造体のフィールドに_HEAPINFOヒープへの有効なポインターが含まれていないかentryinfo、null ポインターです。
_HEAPEND ヒープの終わりに正常に到達しました。
_HEAPEMPTY ヒープが初期化されていません。
_HEAPOK これまでのところエラーはありません。entryinfo は、次のヒープ エントリに関する情報で更新されます。

また、エラーが発生した場合、 _heapwalkerrnoENOSYSに設定します。

解説

_heapwalk 関数は、プログラムのヒープ関連の問題をデバッグするのに役立ちます。 この関数はヒープを走査します。呼び出しごとに 1 つのエントリを走査し、次のヒープ エントリに関する情報を含んだ _HEAPINFO 型の構造体へのポインターを返します。 _HEAPINFO 型は Malloc.h で定義されており、次の要素を含んでいます。

フィールド 意味
int *_pentry ヒープ エントリのポインター。
size_t _size ヒープ エントリのサイズ。
int _useflag ヒープ エントリが使用中かどうかを示すフラグ。

_heapwalk を返す _HEAPOK を呼び出すと、エントリのサイズが _size フィールドに格納され、_useflag フィールドが _FREEENTRY または _USEDENTRY (両方とも Malloc.h に定義されている定数です) に設定されます。 ヒープの最初のエントリに関する情報を取得するには、_heapwalk メンバーが _HEAPINFO である _pentry 構造体へのポインターを NULL に渡します。 オペレーティング システムがサポート _heapwalkされていない場合、関数は戻り _HEAPEND 値を設定 errno します ENOSYS

この関数は、そのパラメーターを検証します。 null ポインターの場合entryinfo、「パラメーターの検証」で説明されているように、無効なパラメーター ハンドラーが呼び出されます。 実行の継続が許可された場合、 errnoEINVAL に設定され、関数が _HEAPBADPTRのセキュリティが強化されたバージョンです。

必要条件

ルーチンによって返される値 必須ヘッダー オプション ヘッダー
_heapwalk <malloc.h> <errno.h>

互換性の詳細については、「 Compatibility」を参照してください。

// 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("%8s 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;
    }
}
    USED block at 00310650 of size 0100
    USED block at 00310758 of size 0800
    USED block at 00310F60 of size 0080
    FREE block at 00310FF0 of size 0398
    USED block at 00311390 of size 000D
    USED block at 003113A8 of size 00B4
    USED block at 00311468 of size 0034
    USED block at 003114A8 of size 0039
...
    USED block at 00312228 of size 0010
    USED block at 00312240 of size 1000
    FREE block at 00313250 of size 1DB0
OK - end of heap

関連項目

メモリ割り当て
_heapadd
_heapchk
_heapmin
_heapset