Реализация пользовательского диспетчера строк (базовый метод)
Самый простой способ настроить схему выделения памяти для строковых данных — использовать предоставленный ATL CAtlStringMgr
класс, но предоставить собственные подпрограммы выделения памяти. Конструктор принимает CAtlStringMgr
один параметр: указатель на IAtlMemMgr
объект. IAtlMemMgr
— абстрактный базовый класс, предоставляющий универсальный интерфейс к куче. IAtlMemMgr
Используя интерфейс, CAtlStringMgr
выделяет, перенаправляет и освобождает память, используемую для хранения строковых данных. Вы можете реализовать IAtlMemMgr
интерфейс самостоятельно или использовать один из пяти классов диспетчера памяти, предоставляемых ATL. Диспетчеры памяти, предоставляемые ATL, просто упаковывают существующие средства выделения памяти:
CCRTHeap упаковывает стандартные функции кучи CRT (malloc, free и realloc)
CWin32Heap упаковывает дескриптор кучи Win32 с помощью HeapAlloc, HeapFree и HeapRealloc
CLocalHeap упаковывает API Win32: LocalAlloc, LocalFree и LocalRealloc
CGlobalHeap упаковывает API Win32: GlobalAlloc, GlobalFree и GlobalRealloc.
CComHeap упаковывает ИНТЕРФЕЙСы API-интерфейсов распределителя задач COM: CoTaskMemAlloc, CoTaskMemFree и CoTaskMemRealloc
Для управления строковой памятью наиболее полезным классом является CWin32Heap
то, что он позволяет создавать несколько независимых куч. Например, если вы хотите использовать отдельную кучу только для строк, можно сделать следующее:
// 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);
Чтобы использовать этот частный диспетчер строк для управления памятью для CString
переменной, передайте указатель на диспетчер в качестве параметра конструктору 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;
}
}