HeapFree 関数 (heapapi.h)

HeapAlloc 関数または HeapReAlloc 関数によってヒープから割り当てられたメモリ ブロック解放します。

構文

BOOL HeapFree(
  [in] HANDLE                 hHeap,
  [in] DWORD                  dwFlags,
  [in] _Frees_ptr_opt_ LPVOID lpMem
);

パラメーター

[in] hHeap

メモリ ブロックを解放するヒープへのハンドル。 このハンドルは、 HeapCreate 関数または GetProcessHeap 関数によって返されます。

[in] dwFlags

ヒープの空きオプション。 次の値を指定すると、HeapCreate 関数を使用してヒープが作成されたときに flOptions パラメーターで指定された対応する値がオーバーライドされます。

意味
HEAP_NO_SERIALIZE
0x00000001
シリアル化されたアクセスは使用されません。 詳細については、「解説」を参照してください。

この関数のすべての呼び出しでシリアル化されたアクセスが無効になるようにするには、HeapCreate の呼び出しで HEAP_NO_SERIALIZEを指定します。 この場合、この関数呼び出しで HEAP_NO_SERIALIZE を追加で指定する必要はありません。

プロセス ヒープにアクセスするときは、この値を指定しないでください。 システムは、Ctrl + C ハンドラーなど、アプリケーションのプロセス内に、プロセス ヒープに同時にアクセスする追加のスレッドを作成できます。

[in] lpMem

解放するメモリ ブロックへのポインター。 このポインターは、 HeapAlloc 関数または HeapReAlloc 関数によって返されます。 このポインターには NULL を指定できます。

戻り値

関数が成功すると、戻り値は 0 以外になります。

関数が失敗した場合は、0 を返します。 アプリケーションは、 GetLastError を 呼び出して、拡張エラー情報を取得できます。

注釈

HeapFree によって解放されたメモリを参照しないでください。 そのメモリが解放された後、そのメモリに含まれる可能性のある情報は永遠に失われます。 情報が必要な場合は、情報を含むメモリを解放しないでください。 メモリに関する情報 ( HeapSize など) を返す関数呼び出しは、偽データを返す可能性があるため、解放されたメモリでは使用できません。 同じポインターで HeapFree を 2 回呼び出すと、ヒープが破損し、その後 の HeapAlloc の呼び出しで同じポインターが 2 回返される可能性があります。

シリアル化により、2 つ以上のスレッドが同じヒープからブロックを同時に割り当てたり解放したりしようとすると、相互の除外が保証されます。 シリアル化にはパフォーマンス コストは小さくなりますが、複数のスレッドが同じヒープからメモリを割り当てて解放するたびに使用する必要があります。 HEAP_NO_SERIALIZE値を設定すると、ヒープでの相互除外がなくなります。 シリアル化を行わないと、同じヒープ ハンドルを使用する 2 つ以上のスレッドが同時にメモリの割り当てまたは解放を試み、ヒープが破損する可能性があります。 したがって、 HEAP_NO_SERIALIZE 値は、次の状況でのみ安全に使用できます。

  • プロセスに含まれるスレッドは 1 つだけです。
  • プロセスには複数のスレッドがありますが、特定のヒープに対してヒープ関数を呼び出すスレッドは 1 つだけです。
  • このプロセスには複数のスレッドがあり、アプリケーションには特定のヒープへの相互除外のための独自のメカニズムが用意されています。

例については、「 プロセス ヒープの取得」を参照してください。

要件

要件
サポートされている最小のクライアント Windows XP [デスクトップ アプリ | UWP アプリ]
サポートされている最小のサーバー Windows Server 2003 [デスクトップ アプリのみ | UWP アプリ]
対象プラットフォーム Windows
ヘッダー heapapi.h (Windows.h を含む)
Library Kernel32.lib
[DLL] Kernel32.dll

関連項目

ヒープ関数

HeapAlloc

HeapReAlloc

メモリ管理関数

VBS エンクレーブで使用できる Vertdll API