Implementation of a Custom String Manager (Basic Method)
Die einfachste Möglichkeit, das Speicherbelegungsschema für Zeichenfolgendaten anzupassen, ist die Verwendung der ATL-zurVerfügung kann CAtlStringMgr-Klasse stellt aber eigene Speicherbelegungsroutinen. Der Konstruktor für CAtlStringMgr verwendet einen einzelnen Parameter: ein Zeiger auf einen IAtlMemMgr-Objekt. IAtlMemMgr ist eine abstrakte Basisklasse, die eine generische Schnittstelle für einen Heap bereitstellt. Verwenden der IAtlMemMgr-Schnittstelle ordnet CAtlStringMgr zu, teilt neu zu und gibt den Speicher frei, der verwendet wird, um Zeichenfolgendaten zu speichern. Sie können entweder die IAtlMemMgr-Schnittstelle selbst implementieren, oder verwenden Sie eines der fünf ATL-zurVerfügung kann Speicher-Manager-Klassen. ATL-stellte Speicherbelegungen des Umbruchs der Speicher-Manager einfach vorhandene bereit:
CCRTHeapUmschließt die Heapfunktionen des standardmäßigen CRT ein (malloc, frei und realloc)
CWin32HeapUmschließt ein Win32-Heaphandle, mit HeapAlloc, HeapFree und HeapRealloc ein
CLocalHeapUmschließt die Win32-API ein: LocalAlloc, LocalFree und LocalRealloc
CGlobalHeapUmschließt die Win32-API ein: GlobalAlloc, GlobalFree und GlobalRealloc.
CComHeapUmschließt die COM-Aufgaben-Belegungsfunktion API ein: CoTaskMemAlloc, CoTaskMemFree und CoTaskMemRealloc
Für Zeichenfolgenspeicherverwaltung ist die zweckmäßigste Klasse CWin32Heap, da sie Ihnen ermöglicht, mehrere unabhängige Heaps zu erstellen. Wenn Sie beispielsweise einen separaten Heap nur für Zeichenfolgen verwenden möchten, können Sie wie folgt vorgehen:
// 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);
Um diesen privaten Zeichenfolgenmanager mit Speicher für eine CString-Variable zu verwalten, führen Sie einen Zeiger auf den Manager als Parameter an den Konstruktor der CString-Variable:
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;
}
}