自定义字符串管理器的实现(基本方法)
自定义字符串数据的内存分配方案的最简单方法是使用 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;
}
}
另请参阅
反馈
https://aka.ms/ContentUserFeedback。
即将发布:在整个 2024 年,我们将逐步淘汰作为内容反馈机制的“GitHub 问题”,并将其取代为新的反馈系统。 有关详细信息,请参阅:提交和查看相关反馈