Implementazione di un gestore personalizzato di stringa (metodo di base)
Il modo più semplice per personalizzare la combinazione di allocazione della memoria per i dati in formato stringa è di utilizzare ATL- fornita dalla classe CAtlStringMgr ma fornisce le routine di allocazione della memoria.Il costruttore per CAtlStringMgr accetta un solo parametro: un puntatore a un oggetto IAtlMemMgr.IAtlMemMgr è una classe base astratta che fornisce un'interfaccia generica a un heap.Utilizzando l'interfaccia IAtlMemMgr, CAtlStringMgr, riallocare alloca e libera la memoria utilizzata per archiviare i dati in formato stringa.È possibile implementare l'interfaccia IAtlMemMgr manualmente, o utilizzare uno dei cinque ATL- fornito le classi del gestore di memoria.ATL- fornito con le funzionalità esistenti di allocazione della memoria del wrapping dei gestori della memoria:
CCRTHeapEsegue il wrapping di heap CRT standard esecuzione (malloc, liberoe realloc)
CWin32HeapEsegue il wrapping di un handle dell'heap Win32, utilizzando HeapAlloc, HeapFreee HeapRealloc
CLocalHeapEsegue il wrapping delle API Win32: LocalAlloc, LocalFreee LocalRealloc
CGlobalHeapEsegue il wrapping delle API Win32: GlobalAlloc, GlobalFreee GlobalRealloc.
CComHeapEsegue il wrapping l'allocatore API di attività COM: CoTaskMemAlloc, CoTaskMemFreee CoTaskMemRealloc
Per la gestione della memoria di stringhe, la classe più utile è CWin32Heap perché consente di creare gli heap non più.Ad esempio, se si desidera utilizzare un heap separato solo per le stringhe, effettuare le operazioni seguenti:
// 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);
Per utilizzare questo gestore privato della stringa per la gestione della memoria per una variabile CString, passare un puntatore all'amministratore come parametro al costruttore della variabile 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;
}
}