사용자 지정 문자열 관리자 구현(기본 방법)
문자열 데이터에 대한 메모리 할당 체계를 사용자 지정하는 가장 쉬운 방법은 ATL 제공 CAtlStringMgr
클래스를 사용하지만 사용자 고유의 메모리 할당 루틴을 제공하는 것입니다. 생성자는 개체에 대한 CAtlStringMgr
포인터인 단일 매개 변수를 IAtlMemMgr
사용합니다. IAtlMemMgr
는 힙에 제네릭 인터페이스를 제공하는 추상 기본 클래스입니다. 인터페이스 CAtlStringMgr
를 IAtlMemMgr
사용하여 문자열 데이터를 저장하는 데 사용되는 메모리를 할당, 재할당 및 해제합니다. 인터페이스를 IAtlMemMgr
직접 구현하거나 5개의 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;
}
}