Özel Dize Yöneticisi’ni Uygulama (Temel Yöntem)
Dize verileri için bellek ayırma düzenini özelleştirmenin en kolay yolu, ATL tarafından sağlanan CAtlStringMgr
sınıfı kullanmak, ancak kendi bellek ayırma yordamlarınızı sağlamaktır. oluşturucu CAtlStringMgr
tek bir parametre alır: nesne işaretçisi IAtlMemMgr
. IAtlMemMgr
bir yığına genel bir arabirim sağlayan soyut bir temel sınıftır. arabirimini IAtlMemMgr
kullanarak dize verilerini depolamak CAtlStringMgr
için kullanılan belleği ayırır, yeniden ayırır ve serbest bırakır. Arabirimi kendiniz uygulayabilir IAtlMemMgr
veya ATL tarafından sağlanan beş bellek yöneticisi sınıfından birini kullanabilirsiniz. ATL tarafından sağlanan bellek yöneticileri, mevcut bellek ayırma olanaklarını sarmalar:
CCRTHeap Standart CRT yığın işlevlerini (malloc, free ve realloc) sarmalar
CWin32Heap HeapAlloc, HeapFree ve HeapRealloc kullanarak win32 yığın tutamacını sarmalar
CLocalHeap Win32 API'lerini Sarmalar: LocalAlloc, LocalFree ve LocalRealloc
CGlobalHeap Win32 API'lerini sarmalar: GlobalAlloc, GlobalFree ve GlobalRealloc.
CComHeap , COM Görev Ayırıcı API'lerini Sarmalar: CoTaskMemAlloc, CoTaskMemFree ve CoTaskMemRealloc
Dize bellek yönetimi amacıyla en kullanışlı sınıf, birden çok bağımsız yığın oluşturmanıza olanak sağlamasıdır CWin32Heap
. Örneğin, yalnızca dizeler için ayrı bir yığın kullanmak istiyorsanız aşağıdakileri yapabilirsiniz:
// 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);
Bir değişkenin belleğini yönetmek üzere bu özel dize yöneticisini kullanmak için CString
, değişkenin oluşturucusunun parametresi olarak yöneticiye CString
bir işaretçi geçirin:
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;
}
}