次の方法で共有


CWin32Heap クラス

このクラスは、Win32 ヒープ割り当て関数を使用して IAtlMemMgr を実装します。

重要

このクラスとそのメンバーは、Windows ランタイムで実行するアプリケーションで使用することはできません。

構文

class CWin32Heap : public IAtlMemMgr

メンバー

パブリック コンストラクター

名前 説明
CWin32Heap::CWin32Heap コンストラクター。
CWin32Heap::~CWin32Heap デストラクター。

パブリック メソッド

名前 説明
CWin32Heap::Allocate ヒープ オブジェクトからメモリ ブロックを割り当てます。
CWin32Heap::Attach ヒープ オブジェクトを既存のヒープにアタッチします。
CWin32Heap::Detach ヒープ オブジェクトを既存のヒープからデタッチします。
CWin32Heap::Free 以前にヒープから割り当てられたメモリを解放します。
CWin32Heap::GetSize ヒープ オブジェクトから割り当てられたメモリ ブロックのサイズを返します。
CWin32Heap::Reallocate ヒープ オブジェクトからメモリ ブロックを再割り当てします。

パブリック データ メンバー

名前 説明
CWin32Heap::m_bOwnHeap ヒープ ハンドルの現在の所有権を確認するために使用されるフラグ。
CWin32Heap::m_hHeap ヒープ オブジェクトへのハンドル。

解説

CWin32Heap は、HeapAllocHeapFree を含む Win32 ヒープ割り当て関数を使用して、メモリ割り当てメソッドを実装します。 他のヒープ クラスとは異なり、CWin32Heap では、メモリが割り当てられる前に有効なヒープハンドルを提供する必要があります。他のクラスは、既定でプロセス ヒープを使用します。 ハンドルは、コンストラクターまたは CWin32Heap::Attach メソッドに渡すことができます。 詳細については、「CWin32Heap::CWin32Heap」メソッドを参照してください。

IAtlMemMgr の例を参照してください。

継承階層

IAtlMemMgr

CWin32Heap

要件

ヘッダー: atlmem.h

CWin32Heap::Allocate

ヒープ オブジェクトからメモリ ブロックを割り当てます。

virtual __declspec(allocator) void* Allocate(size_t nBytes) throw();

パラメーター

nBytes
新しいメモリ ブロック内の要求されたバイト数。

戻り値

新しく割り当てられたメモリ ブロックへのポインターを返します。

解説

このメソッドによって割り当てられたメモリを解放するには、CWin32Heap::Free または CWin32Heap::Reallocate を呼び出します。

HeapAlloc を使用して実装されます。

CWin32Heap::Attach

ヒープ オブジェクトを既存のヒープにアタッチします。

void Attach(HANDLE hHeap, bool bTakeOwnership) throw();

パラメーター

hHeap
既存のヒープ ハンドルです。

bTakeOwnership
CWin32Heap オブジェクトがヒープのリソースに対して所有権を取得するかどうかを示すフラグ。

解説

bTakeOwnership が TRUE の場合、CWin32Heap オブジェクトによりヒープ ハンドルが削除されます。

CWin32Heap::CWin32Heap

コンストラクター。

CWin32Heap() throw();
CWin32Heap( HANDLE  hHeap) throw();
CWin32Heap(
    DWORD  dwFlags,
    size_t nInitialSize,
    size_t nMaxSize = 0);

パラメーター

hHeap
既存のヒープ オブジェクト。

dwFlags
ヒープの作成に使用されるフラグ。

nInitialSize
ヒープの初期サイズ。

nMaxSize
ヒープの最大サイズ。

解説

メモリを割り当てる前に、CWin32Heap オブジェクトに有効なヒープ ハンドルを提供する必要があります。 これを実現する最も簡単な方法は、プロセス ヒープを使用することです。

CWin32Heap MyHeap(GetProcessHeap());   

また、コンストラクターに既存のヒープ ハンドルを提供できますが、その場合には新しいオブジェクトはヒープの所有権を引き継ぎません。 CWin32Heap オブジェクトが削除されても、元のヒープ ハンドルは依然として有効です。

既存のヒープも、CWin32Heap::Attach を使用して新しいオブジェクトにアタッチできます。

すべての処理がシングル スレッドから行われるときに、ヒープが必要な場合、最適な方法は次のようにオブジェクトを作成することです。

CWin32Heap MyHeap(HEAP_NO_SERIALIZE, SomeInitialSize);   

パラメーター HEAP_NO_SERIALIZEは、ヒープ関数がメモリを割り当てて解放するときに、パフォーマンスの向上に応じて相互除外を使用しないことを指定します。

第 3 のパラメーターの既定値は 0 であり、この場合には必要に応じてヒープを拡大できます。 メモリ サイズおよびフラグについては HeapCreate に関するページを参照してください。

CWin32Heap::~CWin32Heap

デストラクター。

~CWin32Heap() throw();

解説

CWin32Heap オブジェクトにヒープの所有権がある場合は、ヒープ ハンドルを破棄します。

CWin32Heap::Detach

ヒープ オブジェクトを既存のヒープからデタッチします。

HANDLE Detach() throw();

戻り値

オブジェクトが以前アタッチされていたヒープにハンドルを返します。

CWin32Heap::Free

CWin32Heap::Allocate または CWin32Heap::Reallocate によって以前にヒープから割り当てられたメモリを解放します。

virtual void Free(void* p) throw();

パラメーター

P
解放するメモリのブロックへのポインター。 NULL は有効な値であり、何も行いません。

CWin32Heap::GetSize

ヒープ オブジェクトから割り当てられたメモリ ブロックのサイズを返します。

virtual size_t GetSize(void* p) throw();

パラメーター

P
メソッドに取得されるサイズを持つメモリ ブロックへのポインター。 これは、CWin32Heap::Allocate または CWin32Heap::Reallocate によって返されるポインターです。

戻り値

割り当てられたメモリのサイズ (バイト単位) が返されます。

CWin32Heap::m_bOwnHeap

m_hHeap に格納されているヒープ ハンドルの現在の所有権を確認するために使用されるフラグ。

bool m_bOwnHeap;

CWin32Heap::m_hHeap

ヒープ オブジェクトへのハンドル。

HANDLE m_hHeap;

解説

ヒープ オブジェクトへのハンドルを格納するために使用する変数。

CWin32Heap::Reallocate

ヒープ オブジェクトからメモリ ブロックを再割り当てします。

virtual __declspec(allocator) void* Reallocate(void* p, size_t nBytes) throw();

パラメーター

P
再割り当てするメモリ ブロックへのポインター。

nBytes
割り当てられるブロックの新しいサイズ (バイト単位)。 ブロックは大きくすることも小さくすることもできます。

戻り値

新しく割り当てられたメモリ ブロックへのポインターを返します。

解説

p が NULL の場合は、まだメモリ ブロックが割り当てられていないと見なされ、引数が nBytes である CWin32Heap::Allocate が呼び出されます。

関連項目

クラスの概要
IAtlMemMgr クラス
CLocalHeap クラス
CGlobalHeap クラス
CCRTHeap クラス
CComHeap クラス