カスタム文字列マネージャーの実装 (基本的な方法)
文字列データのメモリ割り当て方法を最も簡単にカスタマイズする方法は、ATL に用意されている CAtlStringMgr クラスを使用し、独自のメモリ割り当てルーチンを用意することです。 コンス トラクターのいる CAtlStringMgr、1 つのパラメーターを受け取る。ポインター、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 タスク アロケーター 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;
}
}