カスタム文字列マネージャの実装 (基本的な方法)
更新 : 2007 年 11 月
文字列データのメモリ割り当て方法を最も簡単にカスタマイズする方法は、ATL に用意されている CAtlStringMgr クラスを使用し、独自のメモリ割り当てルーチンを用意することです。CAtlStringMgr のコンストラクタは、IAtlMemMgr オブジェクトへのポインタを唯一のパラメータとして受け取ります。IAtlMemMgr は、ヒープにジェネリック インターフェイスを提供する抽象基本クラスです。IAtlMemMgr インターフェイスを使用して、CAtlStringMgr は、文字列データの格納に使用するメモリを割り当て、再割り当て、および解放します。IAtlMemMgr インターフェイスを独自に実装することも、ATL に用意されている 5 つのメモリ マネージャ クラスのいずれかを使用することもできます。ATL に用意されているメモリ マネージャは、既存のメモリ割り当て機能を単純にラップします。
CWin32Heap** **HeapAlloc、HeapFree、および HeapRealloc を使用して、Win32 ヒープ ハンドルをラップします。
CLocalHeap Win32 API である LocalAlloc、LocalFree、および LocalRealloc をラップします。
CGlobalHeap** **Win32 API である GlobalAlloc、GlobalFree、GlobalRealloc をラップします。
CComHeap COM Task Allocator 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;
}
}