_heapwalk

更新 : 2007 年 11 月

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

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
    ヒープ エントリが使用中かどうかを示すフラグ

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

この関数は、パラメータを検証します。entryinfo が null ポインタの場合は、「パラメータの検証」に説明されているように、無効なパラメータ ハンドラが呼び出されます。実行の継続が許可された場合、errno が EINVAL に設定され、関数から _HEAPBADPTR が返されます。

必要条件

ルーチン

必須ヘッダー

オプション ヘッダー

_heapwalk

<malloc.h>

<errno.h>

互換性の詳細については、「C ランタイム ライブラリ」の「互換性」を参照してください。

使用例

// 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;
    }
}
  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

.NET Framework の相当するアイテム

適用できません。標準 C 関数を呼び出すには、PInvoke を使用します。詳細については、「プラットフォーム呼び出しの例」を参照してください。

参照

参照

メモリ割り当て

_heapadd

_heapchk

_heapmin

_heapset