Implementace vlastního správce řetězců (základní způsob)
Nejjednodušší způsob, jak přizpůsobit schéma přidělování paměti pro řetězcová data, je použít třídu poskytovanou CAtlStringMgr
atL, ale poskytnout vlastní rutiny přidělování paměti. Konstruktor pro CAtlStringMgr
přebírá jeden parametr: ukazatel na IAtlMemMgr
objekt. IAtlMemMgr
je abstraktní základní třída, která poskytuje obecné rozhraní haldy. IAtlMemMgr
Pomocí rozhraní CAtlStringMgr
přidělí, relokuje a uvolní paměť použitou k ukládání řetězcových dat. Buď můžete implementovat IAtlMemMgr
rozhraní sami, nebo použít jednu z pěti tříd správce paměti poskytované ATL. Správci paměti poskytované ATL jednoduše zabalí stávající zařízení přidělení paměti:
CCRTHeap Wraps the standard CRT haldy functions (malloc, free a realloc)
CWin32Heap Wraps a Win32 haldy handle, using HeapAlloc, HeapFree a HeapRealloc
CLocalHeap Zabalí rozhraní API Win32: LocalAlloc, LocalFree a LocalRealloc
CGlobalHeap Wraps the Win32 APIs: GlobalAlloc, GlobalFree a GlobalRealloc.
CComHeap Wraps the COM Task Allocator APIs: CoTaskMemAlloc, CoTaskMemFree a CoTaskMemRealloc
Pro účely správy paměti řetězců je nejužitečnější třída CWin32Heap
, protože umožňuje vytvořit více nezávislých hald. Pokud byste například chtěli použít samostatnou haldu jenom pro řetězce, můžete udělat toto:
// 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);
Pokud chcete použít tohoto správce privátních řetězců ke správě paměti pro proměnnou CString
, předejte správci ukazatel jako parametr konstruktoru CString
proměnné:
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;
}
}