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. CFixedStringT
pochodzi 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ż
Opinia
https://aka.ms/ContentUserFeedback.
Dostępne już wkrótce: W 2024 r. będziemy stopniowo wycofywać zgłoszenia z serwisu GitHub jako mechanizm przesyłania opinii na temat zawartości i zastępować go nowym systemem opinii. Aby uzyskać więcej informacji, sprawdź:Prześlij i wyświetl opinię dla