カスタム文字列マネージャーの実装 (基本メソッド)
文字列データのメモリ割り当てスキームをカスタマイズする最も簡単な方法は、ATL 指定の CAtlStringMgr
クラスを使用しながら、独自のメモリ割り当てルーチンを指定することです。 CAtlStringMgr
のコンストラクターは、IAtlMemMgr
オブジェクトへのポインターという単一のパラメーター を受け取ります。 IAtlMemMgr
では、抽象基底クラスであり、ヒープへのジェネリック インターフェイスを指定します。 IAtlMemMgr
インターフェイスを使用すると、文字列データを保存するために使用されるメモリが、CAtlStringMgr
によって割り当て、再割り当て、および解放されます。 IAtlMemMgr
インターフェイスを自分で実装するか、5 つある ATL 指定のメモリ マネージャー クラスのいずれかを使用することができます。 ATL 指定のメモリ マネージャーを使用すると、既存のメモリ割り当て機能が単にラップされます。
CWin32Heap HeapAlloc、HeapFree、および HeapRealloc を使用して、Win32 ヒープ ハンドルをラップします
CLocalHeap Win32 API (LocalAlloc、LocalFree、および LocalRealloc) をラップします
CGlobalHeap Win32 APIs (GlobalAlloc、GlobalFree、およびGlobalRealloc) をラップします。
CComHeap COM タスク アロケーター API (CoTaskMemAlloc、CoTaskMemFree、および CoTaskMemRealloc) をラップします
文字列メモリ管理を目的とする場合、複数の独立したヒープを作成できるため、CWin32Heap
クラスが最も便利です。 たとえば、文字列に対してのみ個別のヒープを使用する場合は、次の操作を実行できます。
// Declare a thread-safe, growable, private heap with initial size 0:
CWin32Heap g_stringHeap(0, 0, 0);
// Declare a string manager that uses the private heap:
CAtlStringMgr g_stringMgr(&g_stringHeap);
このプライベート文字列マネージャーを使用して CString
変数のメモリを管理するには、マネージャーへのポインターをパラメーターとして、CString
変数のコンストラクターに渡します。
void PrintPowers(int nBase)
{
int n = 1;
for(int nPower = 0; nPower < 10; nPower++)
{
// Use the private string manager, instead of the default:
CString strPower(&g_stringMgr);
strPower.Format(_T("%d"), n);
_tprintf_s(_T("%s\n"), strPower);
n *= nBase;
}
}