自定义字符串管理器(基本方法的实现
最简单的方法自定义字符串数据的内存分配模式将使用ATL提供了 CAtlStringMgr 选件类,但提供自己的内存分配例程。 CAtlStringMgr 的构造函数采用单个参数:为 IAtlMemMgr 对象的指针。 IAtlMemMgr 是一个泛型接口使堆的抽象基类。 使用 IAtlMemMgr 接口,CAtlStringMgr 分配,重新分配,并释放使用的内存存储字符串数据。 您可以实现 IAtlMemMgr 接口,或者使用之一个ATL提供的内存管理器选件类。 ATL提供的内存管理器包装现有内存分配结构:
CWin32Heap使用 HeapAlloc、 HeapFree和 HeapRealloc,用于包装Win32堆处理,
CLocalHeap包装Win32 API: LocalAlloc、 LocalFree和 LocalRealloc
CGlobalHeap包装Win32 API: GlobalAlloc、 GlobalFree和 GlobalRealloc。
CComHeap包装COM任务分配程序API: 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;
}
}