Udostępnij za pośrednictwem


CFixedStringT: przykład niestandardowego menedżera ciągów

Biblioteka ATL implementuje jeden przykład niestandardowego menedżera ciągów używany przez klasę CFixedStringT o nazwie CFixedStringMgr. CFixedStringTpochodzi z CStringT i implementuje ciąg, który przydziela jego dane znaków w ramach CFixedStringT samego obiektu, o ile ciąg jest mniejszy niż długość określona przez t_nChars parametr szablonu CFixedStringT. W przypadku tego podejścia ciąg w ogóle nie potrzebuje sterty, chyba że długość ciągu przekroczy rozmiar stałego buforu. Ponieważ CFixedStringT nie zawsze używa sterta do przydzielenia danych ciągów, nie może być używany CAtlStringMgr jako menedżer ciągów. Używa niestandardowego menedżera ciągów (CFixedStringMgr), implementując interfejs IAtlStringMgr . Ten interfejs został omówiony w temacie Implementacja niestandardowego menedżera ciągów (metoda zaawansowana).

Konstruktor dla CFixedStringMgr przyjmuje trzy parametry:

  • pData: wskaźnik do stałej CStringData struktury do użycia.

  • nChars: maksymalna liczba znaków, które CStringData może pomieścić struktura.

  • pMgr: wskaźnik do IAtlStringMgr interfejsu "menedżera ciągów kopii zapasowej".

Konstruktor przechowuje wartości pData i pMgr w odpowiednich zmiennych składowych (m_pData i m_pMgr). Następnie ustawia długość buforu na zero, dostępną długość równą maksymalnemu rozmiarowi stałego buforu i liczbie odwołań do -1. Wartość licznika odwołań wskazuje, że bufor jest zablokowany i używa tego wystąpienia CFixedStringMgr jako menedżera ciągów.

Oznaczanie buforu jako zablokowanego uniemożliwia innym CStringT wystąpieniom przechowywanie współużytkowanego odwołania do buforu. Jeśli inne CStringT wystąpienia mogły współużytkować bufor, możliwe byłoby usunięcie buforu, CFixedStringT podczas gdy inne ciągi nadal używały buforu.

CFixedStringMgr jest pełną implementacją interfejsu IAtlStringMgr . Implementacja każdej metody jest omawiana oddzielnie.

Implementacja CFixedStringMgr::Allocate

Implementacja CFixedStringMgr::Allocate pierwszych kontroli, aby sprawdzić, czy żądany rozmiar ciągu jest mniejszy lub równy rozmiarowi stałego buforu (przechowywanego w elemencie m_pData członkowskim). Jeśli stały bufor jest wystarczająco duży, CFixedStringMgr blokuje stały bufor o długości zera. Dopóki długość ciągu nie przekroczy rozmiaru stałego buforu, CStringT nie będzie musiał ponownie przydzielić buforu.

Jeśli żądany rozmiar ciągu jest większy niż stały bufor CFixedStringMgr przekazuje żądanie do menedżera ciągów kopii zapasowej. Przyjmuje się, że menedżer ciągów kopii zapasowych przydziela bufor z sterta. Jednak przed zwróceniem tego buforu CFixedStringMgr blokuje bufor i zastępuje wskaźnik menedżera ciągów buforu CFixedStringMgr wskaźnikiem do obiektu. Gwarantuje to, że próby reallokowania lub zwolnienia buforu przez CStringT wywołają metodę CFixedStringMgr.

Implementacja CFixedStringMgr::ReAllocate

Implementacja programu jest bardzo podobna CFixedStringMgr::ReAllocate do implementacji programu Allocate.

Jeśli przydział buforu jest stały bufor, a żądany rozmiar buforu jest mniejszy niż stały bufor, nie jest wykonywana żadna alokacja. Jeśli jednak przydział buforu nie jest stałym buforem, musi być buforem przydzielonym menedżerowi kopii zapasowych. W takim przypadku menedżer kopii zapasowych jest używany do reallokowania buforu.

Jeśli przydział buforu jest stały bufor, a nowy rozmiar buforu jest zbyt duży, aby zmieścił się w stałym buforze, CFixedStringMgr przydziela nowy bufor przy użyciu menedżera kopii zapasowych. Zawartość stałego buforu jest następnie kopiowana do nowego buforu.

Implementacja CFixedStringMgr::Free

Implementacja jest zgodna z CFixedStringMgr::Free tym samym wzorcem co Allocate i ReAllocate. Jeśli zwalniany bufor jest stałym buforem, metoda ustawia go na bufor zablokowany o zerowej długości. Jeśli zwalniany bufor został przydzielony do menedżera kopii zapasowych, użyj menedżera kopii zapasowych, CFixedStringMgr aby go zwolnić.

Implementacja CFixedStringMgr::Clone

Implementacja CFixedStringMgr::Clone zawsze zwraca wskaźnik do menedżera kopii zapasowych, a nie CFixedStringMgr sam. Dzieje się tak, ponieważ każde wystąpienie CFixedStringMgr programu może być skojarzone tylko z pojedynczym wystąpieniem klasy CStringT. Wszystkie inne wystąpienia CStringT próby sklonowania menedżera powinny zamiast tego uzyskać menedżera kopii zapasowych. Dzieje się tak, ponieważ menedżer kopii zapasowych obsługuje udostępnianie.

Implementacja CFixedStringMgr::GetNilString

Implementacja CFixedStringMgr::GetNilString zwraca stały bufor. Ze względu na korespondencję CFixedStringMgr "jeden na jeden" i CStringT, dane wystąpienie CStringT nigdy nie używa więcej niż jednego buforu naraz. W związku z tym ciąg zerowy i rzeczywisty bufor ciągu nigdy nie są potrzebne w tym samym czasie.

Zawsze, gdy stały bufor nie jest używany, CFixedStringMgr gwarantuje, że jest inicjowany z zerową długością. Dzięki temu można go używać jako ciągu zerowego. Jako dodatkowy bonus, element nAllocLength członkowski stałego buforu jest zawsze ustawiony na pełny rozmiar stałego buforu. Oznacza to, że CStringT można zwiększyć ciąg bez wywoływania metody IAtlStringMgr::Reallocate, nawet w przypadku ciągu zerowego.

Wymagania

Nagłówek: cstringt.h

Zobacz też

Zarządzanie pamięcią za pomocą CStringT