Implementierung eines benutzerdefinierten Zeichenfolgenmanagers (grundlegende Methode)
Die einfachste Möglichkeit zum Anpassen des Speicherzuordnungsschemas für Zeichenfolgendaten besteht darin, die von ATL bereitgestellte CAtlStringMgr
Klasse zu verwenden, aber Ihre eigenen Speicherzuweisungsroutinen bereitzustellen. Der Konstruktor für CAtlStringMgr
einen einzelnen Parameter: einen Zeiger auf ein IAtlMemMgr
Objekt. IAtlMemMgr
ist eine abstrakte Basisklasse, die eine generische Schnittstelle zu einem Heap bereitstellt. Mithilfe der IAtlMemMgr
Schnittstelle werden die CAtlStringMgr
Zuweisungen, Zuordnungen und Zuordnungen freigegeben und der Speicher freigegeben, der zum Speichern von Zeichenfolgendaten verwendet wird. Sie können die IAtlMemMgr
Schnittstelle entweder selbst implementieren oder eine der fünf von ATL bereitgestellten Speicher-Manager-Klassen verwenden. Die von ATL bereitgestellten Speichermanager schließen einfach vorhandene Speicherzuweisungseinrichtungen ein:
CCRTHeap wraps the standard CRT heap functions (malloc, free, and realloc)
CWin32Heap wraps a Win32 heap handle, using HeapAlloc, HeapFree, and HeapRealloc
CLocalHeap umschließt die Win32-APIs: LocalAlloc, LocalFree und LocalRealloc
CGlobalHeap umschließt die Win32-APIs: GlobalAlloc, GlobalFree und GlobalRealloc.
CComHeap umschließt die COM Task Allocator-APIs: CoTaskMemAlloc, CoTaskMemFree und CoTaskMemRealloc
Zum Zweck der Zeichenfolgenspeicherverwaltung ist CWin32Heap
die nützlichste Klasse, da Sie mehrere unabhängige Heaps erstellen können. Wenn Sie beispielsweise nur für Zeichenfolgen einen separaten Heap verwenden möchten, können Sie die folgenden Aktionen ausführen:
// 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 Zeichenfolgen-Manager zum Verwalten des Arbeitsspeichers für eine CString
Variable zu verwenden, übergeben Sie einen Zeiger als Parameter an den Manager an den Konstruktor der CString
Variablen:
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;
}
}