Implementação de um gerenciador de cadeia de caracteres personalizada (método básico)
A maneira mais fácil de personalizar o esquema de alocação de memória para dados de cadeia de caracteres é usar a classe CAtlStringMgr
fornecida pela ATL, mas fornecer suas próprias rotinas de alocação de memória. O construtor para CAtlStringMgr
usa um único parâmetro: um ponteiro para um objeto IAtlMemMgr
. IAtlMemMgr
é uma classe base abstrata que fornece uma interface genérica para um heap. Usando a interface IAtlMemMgr
, o CAtlStringMgr
aloca, realoca e libera a memória usada para armazenar dados de cadeia de caracteres. Você pode implementar a interface IAtlMemMgr
por conta própria ou usar uma das cinco classes do gerenciador de memória fornecido pela ATL. Os gerenciadores de memória fornecidos pela ATL simplesmente encapsulam as instalações de alocação de memória existentes:
CCRTHeap Encapsula as funções de heap CRT padrão (malloc, free e realloc)
CWin32Heap Encapsula um identificador de heap do Win32 usando HeapAlloc, HeapFree e HeapRealloc
CLocalHeap Encapsula as APIs do Win32: LocalAlloc, LocalFree e LocalRealloc
CGlobalHeap Encapsula as APIs do Win32: GlobalAlloc, GlobalFree e GlobalRealloc.
CComHeap Encapsula as APIs do Alocador de Tarefas COM: CoTaskMemAlloc, CoTaskMemFree e CoTaskMemRealloc
Para fins de gerenciamento de memória de cadeia de caracteres, a classe mais útil é CWin32Heap
porque permite que você crie vários heaps independentes. Por exemplo, se você quisesse usar um heap separado apenas para cadeias de caracteres, 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);
Para usar esse gerenciador de cadeia de caracteres privado para gerenciar a memória de uma variável CString
, passe um ponteiro para o gerenciador como um parâmetro para o construtor da variável 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;
}
}