Implementation of a Custom String Manager (Basic Method)
Самый простой способ настройки схема выделения памяти для строковых данных использовать библиотеку ATL-, класс CAtlStringMgr но предоставляет собственные процедуры выделения памяти. Конструктор для CAtlStringMgr принимает один параметр: указатель на объект IAtlMemMgr. IAtlMemMgr абстрактный базовый класс, который предоставляет универсальный интерфейс куча. С помощью интерфейса IAtlMemMgr, CAtlStringMgr, reallocates и освобождает память, используемая для хранения сведений строки. Самостоятельно любой реализовать интерфейс IAtlMemMgr или использовать одно из 5 библиотеки 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;
}
}