Implementação de um gerente personalizado de cadeia de caracteres (básico método)
A maneira mais fácil para personalizar o esquema de alocação de memória para dados de cadeia de caracteres é usar ATL- forneceu a classe de CAtlStringMgr mas fornece seu próprio rotinas de alocação de memória.O construtor para CAtlStringMgr aceita um único parâmetro: um ponteiro para um objeto de IAtlMemMgr .IAtlMemMgr é uma classe base abstrata que fornece uma interface genérica a um heap.Usando a interface de IAtlMemMgr , CAtlStringMgr atributos, realoca, e libera memória usada para armazenar dados de cadeia de caracteres.Ou você pode implementar a interface de IAtlMemMgr você mesmo, ou use um dos cinco ATL- forneceu classes gerente de memória.ATL- forneceu recursos existentes de alocação de memória de quebra automática de gerentes de memória simplesmente:
CCRTHeapEnvolve as funções do heap de CRT de padrão (malloc, livre, e realloc)
CWin32HeapEnvolve um identificador do heap do Win32, usando HeapAlloc, HeapFree, e HeapRealloc
CLocalHeapEnvolve APIs do Win32: LocalAlloc, LocalFree, e LocalRealloc
CGlobalHeapEnvolve APIs do Win32: GlobalAlloc, GlobalFree, e GlobalRealloc.
CComHeapEnvolve APIs do distribuidor de tarefa COM: CoTaskMemAlloc, CoTaskMemFree, e CoTaskMemRealloc
Com o objetivo de gerenciamento de memória de cadeia de caracteres, a classe mais útil é CWin32Heap porque ela permite que você crie heaps independente de múltiplos.Por exemplo, se você quisesse usar um heap separado apenas para cadeias de caracteres, você pode fazer o seguinte:
// 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 usar o gerenciador particular de cadeia de caracteres para gerenciar a memória para um variável de CString , passe um ponteiro para o gerenciador como um parâmetro para o construtor da variável 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;
}
}