文字列データのメモリ割り当て方法をカスタマイズする最も簡単な方法は、ATL 提供します。CAtlStringMgr のクラスが用意されています。独自のメモリ割り当てルーチンを使用することですが。CAtlStringMgr のコンストラクターは一つのパラメーターを持っています: IAtlMemMgr オブジェクトへのポインター。IAtlMemMgr はヒープにジェネリック インターフェイスを提供する抽象基本クラスです。IAtlMemMgr のインターフェイスを使用すると、CAtlStringMgr は、文字列データの格納に使用されるメモリの割り当ておよび再割り当ておよび解放します。いずれかの IAtlMemMgr 独自のインターフェイスを実装するか、5 の 1 を使用すると、メモリ マネージャーの ATL クラスを提供します。メモリ マネージャーでラップの既存のメモリ割り当て機能を提供しました: ATL
CWin32HeapHeapAlloc、HeapFreeと HeapReallocを使用して Win32 ヒープのハンドルを、ラップします
CLocalHeapWin32 API をラップします: LocalAlloc、LocalFreeと LocalRealloc
CGlobalHeapWin32 API をラップします: GlobalAlloc、GlobalFreeと GlobalRealloc。
CComHeapCOM のタスクのアロケーターの 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;
}
}