Udostępnij za pośrednictwem


Wdrożenie niestandardowego menedżera ciągów (metoda zaawansowana)

W wyspecjalizowanych sytuacjach warto zaimplementować niestandardowego menedżera ciągów, który nie tylko zmienia stertę używaną do przydzielania pamięci. W takiej sytuacji należy ręcznie zaimplementować interfejs IAtlStringMgr jako niestandardowego menedżera ciągów.

Aby to zrobić, należy najpierw zrozumieć, jak usługa CStringT używa tego interfejsu do zarządzania danymi ciągów. Każde wystąpienie obiektu CStringT ma wskaźnik do struktury CStringData . Ta struktura o zmiennej długości zawiera ważne informacje o ciągu (takie jak długość), a także rzeczywiste dane znaków dla ciągu. Każdy niestandardowy menedżer ciągów jest odpowiedzialny za przydzielanie i zwalnianie tych struktur na żądanie CStringT.

Struktura CStringData składa się z czterech pól:

  • pStringMgr To pole wskazuje IAtlStringMgr interfejs używany do zarządzania tymi danymi ciągu. Jeśli CStringT konieczne jest reallocate lub zwolnić bufor ciągu wywołuje metody Reallocate lub Free tego interfejsu, przekazując CStringData strukturę jako parametr. Podczas przydzielania struktury w menedżerze CStringData ciągów należy ustawić to pole tak, aby wskazywało niestandardowego menedżera ciągów.

  • nDataLength To pole zawiera bieżącą długość logiczną ciągu przechowywanego w buforze z wyłączeniem wartości null zakończenia. CStringT aktualizuje to pole, gdy długość ciągu ulegnie zmianie. Podczas przydzielania CStringData struktury menedżer ciągów musi ustawić to pole na zero. Podczas zmiany przydziału CStringData struktury niestandardowy menedżer ciągów musi pozostawić to pole bez zmian.

  • nAllocLength To pole zawiera maksymalną liczbę znaków (z wyłączeniem wartości null zakończenia), która może być przechowywana w tym buforze ciągów bez ponownego przydziału. Zawsze, gdy CStringT trzeba zwiększyć długość logiczną ciągu, najpierw sprawdza to pole, aby upewnić się, że w buforze jest wystarczająca ilość miejsca. Jeśli sprawdzanie zakończy się niepowodzeniem, CStringT wywołanie niestandardowego menedżera ciągów w celu cofnięcia przydziału buforu. Podczas przydzielania lub reallokowania CStringData struktury należy ustawić to pole na co najmniej liczbę znaków żądanych w parametrze NChars na IAtlStringMgr::Przydziel lub IAtlStringMgr::Reallocate. Jeśli w buforze jest więcej miejsca niż zażądano, możesz ustawić tę wartość tak, aby odzwierciedlała rzeczywistą ilość dostępnego miejsca. CStringT Dzięki temu można powiększyć ciąg, aby wypełnić całe przydzielone miejsce, zanim będzie musiał ponownie wywołać menedżera ciągów w celu ponownego przydzielenie buforu.

  • nRefs To pole zawiera bieżącą liczbę odwołań buforu ciągu. Jeśli wartość jest jedna, pojedyncze wystąpienie CStringT używa buforu. Ponadto wystąpienie może odczytywać i modyfikować zawartość buforu. Jeśli wartość jest większa niż jedna, wiele wystąpień CStringT programu może używać buforu. Ponieważ bufor znaków jest współużytkowany, CStringT wystąpienia mogą odczytywać tylko zawartość buforu. Aby zmodyfikować zawartość, CStringT najpierw tworzy kopię buforu. Jeśli wartość jest ujemna, tylko jedno wystąpienie CStringT używa buforu. W takim przypadku bufor jest uznawany za zablokowany. CStringT Jeśli wystąpienie korzysta z zablokowanego buforu, żadne inne wystąpienia CStringT programu nie mogą współużytkowania buforu. Zamiast tego te wystąpienia tworzą kopię buforu przed manipulowaniem zawartością. Ponadto CStringT wystąpienie używające zablokowanego buforu nie próbuje współużytkować buforu żadnych innych CStringT przypisanych do niego wystąpień. W takim przypadku CStringT wystąpienie kopiuje drugi ciąg do zablokowanego buforu.

    Podczas przydzielania CStringData struktury należy ustawić to pole tak, aby odzwierciedlało typ udostępniania dozwolonego dla buforu. W przypadku większości implementacji ustaw tę wartość na jedną. Umożliwia to zwykłe zachowanie udostępniania kopiowania na zapis. Jeśli jednak menedżer ciągów nie obsługuje udostępniania buforu ciągów, ustaw to pole na stan zablokowany. CStringT Wymusza to użycie tylko tego buforu CStringT dla wystąpienia, które go przydzieliło.

Zobacz też

Zarządzanie pamięcią za pomocą CStringT