Implémentation d’un gestionnaire de chaînes personnalisé (méthode élémentaire)
Le moyen le plus simple de personnaliser le schéma d’allocation de mémoire pour les données de chaîne consiste à utiliser la classe fournie par CAtlStringMgr
ATL, mais à fournir vos propres routines d’allocation de mémoire. Le constructeur prend CAtlStringMgr
un paramètre unique : un pointeur vers un IAtlMemMgr
objet. IAtlMemMgr
est une classe de base abstraite qui fournit une interface générique à un tas. À l’aide de l’interface IAtlMemMgr
, l’allocation CAtlStringMgr
, la réalloue et libère la mémoire utilisée pour stocker les données de chaîne. Vous pouvez implémenter l’interface IAtlMemMgr
vous-même ou utiliser l’une des cinq classes de gestionnaire de mémoire fournies par ATL. Les gestionnaires de mémoire fournis par ATL encapsulent simplement les installations d’allocation de mémoire existantes :
CCRTHeap Encapsule les fonctions de tas CRT standard (malloc, free et realloc)
CWin32Heap Wraps a Win32 Heap HeapAlloc, HeapFree et HeapRealloc
CLocalHeap encapsule les API Win32 : LocalAlloc, LocalFree et LocalRealloc
CGlobalHeap encapsule les API Win32 : GlobalAlloc, GlobalFree et GlobalRealloc.
CComHeap wraps the COM Task Allocator API : CoTaskMemAlloc, CoTaskMemFree et CoTaskMemRealloc
Dans le cadre de la gestion de la mémoire de chaîne, la classe la plus utile est CWin32Heap
parce qu’elle vous permet de créer plusieurs tas indépendants. Par exemple, si vous souhaitez utiliser un tas distinct uniquement pour les chaînes, vous pouvez effectuer les opérations suivantes :
// 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);
Pour utiliser ce gestionnaire de chaînes privé pour gérer la mémoire d’une CString
variable, transmettez un pointeur au gestionnaire en tant que paramètre au constructeur de la CString
variable :
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;
}
}