Implementação do Manager um personalizado String (método básico)
A maneira mais fácil de personalizar o esquema de alocação de memória para dados de seqüência de caracteres é usar as fornecidas pelo ATL CAtlStringMgr classe, mas fornecer sua própria memória rotinas de alocação.O construtor para CAtlStringMgr usa um único parâmetro: um ponteiro para um IAtlMemMgr objeto. IAtlMemMgr é uma classe base abstrata que fornece uma interface genérica para uma pilha. Usando o IAtlMemMgr interface, o CAtlStringMgr aloca realoca e libera a memória usada para armazenar dados de seqüência de caracteres.Implementar o IAtlMemMgr Você mesmo da interface, ou use um dos cinco classes de Gerenciador de memória fornecido pelo ATL. Os gerenciadores de memória fornecido pelo ATL simplesmente dispor instalações existentes de alocação de memória:
CCRTHeap** **Ajusta as funções de heap padrão do CRT (malloc, disponível, and realocar)
CWin32Heap** **Quebra um identificador de heap do Win32, usando HeapAlloc, HeapFree, and HeapRealloc
CLocalHeap** **Empacota as APIs do Win32: LocalAlloc, LocalFree, and LocalRealloc
CGlobalHeap** **Empacota as APIs do Win32: GlobalAlloc, GlobalFree, and GlobalRealloc.
CComHeap** **Ajusta o alocador de tarefas COM APIs: CoTaskMemAlloc, CoTaskMemFree, and CoTaskMemRealloc
Para fins de gerenciamento de memória de seqüência de caracteres, a classe mais úteis é CWin32Heap porque ela permite criar várias pilhas independentes. Por exemplo, se você quiser usar uma heap separada apenas para as seqüências de caracteres, você poderia 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);
Usar este gerenciador de seqüência de caracteres particulares para gerenciar a memória para um CString variável, passar um ponteiro para o Gerenciador de sistema autônomo um parâmetro para o CString construtor da variável:
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;
}
}