次の方法で共有


_heapwalk

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

重要 : 重要

この API は、Windows のランタイムで実行するアプリケーションでデバッグ ビルドの格納場所以外で使用することはできません。詳細については、でサポート /ZW CRT 関数" "を参照してください。

int _heapwalk( 
   _HEAPINFO *entryinfo 
);

パラメーター

  • entryinfo
    ヒープ情報を含むバッファー。

戻り値

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

  • _HEAPBADBEGIN
    無効な検索または最初のヘッダー情報。

  • _HEAPBADNODE
    傷つくヒープまたは不適切な検索ノード。

  • _HEAPBADPTR
    _HEAPINFO の構造体の_pentry のフィールドはヒープに有効なポインターが含まれていないか、または entryinfo が null ポインターです。

  • _HEAPEND
    正常に到達したヒープの終了。

  • _HEAPEMPTY
    初期化ヒープ。

  • _HEAPOK
    これまでのエラーはありません;。entryinfo は、次のヒープ エントリに関する情報で更新されます。

また、エラーが発生すると、_heapwalk は ENOSYSに errno を設定します。

解説

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

  • int *_pentry
    ヒープ エントリのポインター。

  • size_t _size
    ヒープ エントリのサイズ。

  • int _useflag
    フラグ。ヒープ エントリが使用中であるかどうかを示す。

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

この関数は、パラメーターを検証します。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;
    }
}
  
  

同等の .NET Framework 関数

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

参照

関連項目

メモリ割り当て

_heapadd

_heapchk

_heapmin

_heapset