Wdrożenie niestandardowego menedżera ciągów (metoda podstawowa)
Najprostszym sposobem dostosowania schematu alokacji pamięci dla danych ciągów jest użycie klasy atl udostępnionej CAtlStringMgr
, ale zapewnienie własnych procedur alokacji pamięci. Konstruktor dla CAtlStringMgr
przyjmuje pojedynczy parametr: wskaźnik do IAtlMemMgr
obiektu. IAtlMemMgr
jest abstrakcyjną klasą bazową, która udostępnia ogólny interfejs sterta. Za pomocą interfejsu IAtlMemMgr
CAtlStringMgr
przydziela, alokuje i zwalnia pamięć używaną do przechowywania danych ciągów. Interfejs można zaimplementować IAtlMemMgr
samodzielnie lub użyć jednej z pięciu klas menedżera pamięci dostarczonej przez usługę ATL. Menedżery pamięci dostarczone przez atL po prostu opakowuje istniejące obiekty alokacji pamięci:
CCRTHeap opakowuje standardowe funkcje sterty CRT (malloc, free i realloc)
CWin32Heap opakowuje uchwyt sterty Win32 przy użyciu heapAlloc, HeapFree i HeapRealloc
CLocalHeap opakowuje interfejsy API Win32: LocalAlloc, LocalFree i LocalRealloc
CGlobalHeap opakowuje interfejsy API Win32: GlobalAlloc, GlobalFree i GlobalRealloc.
CComHeap opakowuje interfejsy API alokatora zadań COM: CoTaskMemAlloc, CoTaskMemFree i CoTaskMemRealloc
W celu zarządzania pamięcią ciągów najbardziej przydatna jest CWin32Heap
klasa, ponieważ umożliwia tworzenie wielu niezależnych stert. Jeśli na przykład chcesz użyć oddzielnego sterta tylko dla ciągów, możesz wykonać następujące czynności:
// 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);
Aby użyć tego prywatnego menedżera ciągów do zarządzania pamięcią CString
dla zmiennej, przekaż wskaźnik do menedżera jako parametr CString
do konstruktora zmiennej:
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;
}
}