Implementación de un administrador de cadena personalizado (método básico)
La manera más fácil de personalizar el esquema de asignación de memoria para los datos de la cadena es utilizar ATL-proporcionó a la clase de CAtlStringMgr pero proporciona posee las rutinas de asignación de memoria.El constructor de CAtlStringMgr toma un único parámetro: un puntero a un objeto de IAtlMemMgr .IAtlMemMgr es una clase base abstracta que proporciona una interfaz genérica a una pila.Mediante la interfaz de IAtlMemMgr , CAtlStringMgr asigna, reasigna, y libera la memoria usada para almacenar datos de cadena.Puede o implementar la interfaz de IAtlMemMgr personalmente, o usar uno de los cinco ATL-proporcionó a clases del administrador de memoria.ATL-proporcionó a las funciones existentes de asignación de memoria del ajuste de los administradores de memoria simplemente:
CCRTHeapEncapsula las funciones del montón de CRT estándar (malloc, libre, y realloc)
CWin32HeapContiene un identificador de la pila de Win32, mediante HeapAlloc, HeapFree, y HeapRealloc
CLocalHeapEncapsula las API Win32: LocalAlloc, LocalFree, y LocalRealloc
CGlobalHeapEncapsula las API Win32: GlobalAlloc, GlobalFree, y GlobalRealloc.
CComHeapAjusta el asignador API COM de tareas: CoTaskMemAlloc, CoTaskMemFree, y CoTaskMemRealloc
Con el fin de administración de memoria de cadena, la clase más útil es CWin32Heap porque permite crear pilas independientes.Por ejemplo, si desea utilizar un montón aparte solo para las cadenas, podría hacer lo siguiente:
// 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);
Para utilizar este administrador privado de la cadena para administrar la memoria para una variable de CString , pase un puntero al administrador como parámetro al constructor de la variable de 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;
}
}