应该是可以解答你得疑问的了。
为字符串数据自定义内存分配方案的最简单的方式是使用 ATL 提供的 CAtlStringMgr 类,但您需要自己提供内存分配例程。CAtlStringMgr 的构造函数采用单一参数:即指向 IAtlMemMgr 对象的指针。IAtlMemMgr 是提供到堆的一般接口的抽象基类。通过 IAtlMemMgr 接口,CAtlStringMgr 分配、重新分配和释放用于存储字符串数据的内存。您既可以自已实现 IAtlMemMgr 接口,也可以使用由 ATL 提供的五个内存管理器类之一。ATL 提供的内存管理器只包装现有的内存分配功能:
CCRTHeap 包装标准 CRT 堆功能(malloc、free 和 realloc)
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( "%d", n );
printf( "%s\n", LPCSTR( strPower ) );
n *= nBase;
}
}
|