Wdrożenia z Menedżera ciąg niestandardowa (zaawansowane metody)
W specjalnych sytuacjach można zaimplementować Menedżera niestandardowy ciąg, który więcej niż tylko zmienić sterty, który jest używany do przydzielania pamięci.W takiej sytuacji należy ręcznie zaimplementować IAtlStringMgr interfejsu Menedżera niestandardowy ciąg.
W tym celu jest najpierw zrozumieć jak CStringT używa interfejsu zarządzania jego danych string.Każde wystąpienie CStringT ma wskaźnik do CStringData struktury.Ta struktura o zmiennej długości zawiera ważne informacje dotyczące ciąg (np. długość) oraz danych rzeczywistych znaków ciągu.Każdy Menedżer niestandardowy ciąg jest odpowiedzialny za alokowanie i zwalnianie tych struktur na wniosek CStringT.
CStringData Struktury obejmuje cztery pola:
pStringMgr to pole wskazuje na IAtlStringMgr interfejs służący do zarządzania danymi ten ciąg.Gdy CStringT potrzebuje do ponownego przydzielenia lub zwolnić buforu ciągu wywołuje Ponowna alokacja lub wolnych metod interfejsu przekazując CStringData struktury jako parametr.Przydzielanie CStringData struktury w ciągu menedżera, należy ustawić to pole, wskaż polecenie Niestandardowy ciąg menedżera.
nDataLength to pole zawiera bieżący logiczne długość ciągu przechowywane w buforze, z wyłączeniem zakończeń null.CStringTaktualizuje to pole po zmianie długość ciągu.Przydzielanie CStringData struktury, Menedżera ciąg musi w tym polu wartość zero.Podczas ponownego przydzielania CStringData strukturę, Menedżera niestandardowy ciąg to pole powinno pozostać bez zmian.
nAllocLength to pole zawiera maksymalną liczbę znaków (z wyłączeniem zakończeń null), które mogą być przechowywane w tym buforze ciągu bez ponownego rozdzielania go.Gdy CStringT musi zwiększyć logiczne długość ciągu, najpierw sprawdza to pole, aby upewnić się, że jest za mało miejsca w buforze.Jeśli sprawdzanie zakończy się niepowodzeniem, CStringT wywołania do Menedżera niestandardowy ciąg ponownego przydzielenia buforu.Podczas przydzielania lub ponownego rozdzielania CStringData strukturę, należy ustawić to pole co najmniej liczbę znaków w nChars parametr IAtlStringMgr::Allocate lub IAtlStringMgr::Reallocate.Jeśli istnieje więcej miejsca w buforze, niż żądano, można ustawić tę wartość, aby odzwierciedlić rzeczywista ilość dostępnego miejsca.Umożliwia to CStringT rośnie ciąg, aby wypełnić cały przydzielone miejsce zanim ma oddzwonić do Menedżera ciąg ponownego przydzielenia buforu.
nRefs to pole zawiera bieżący licznik odniesienia buforu ciągu.Jeśli ma wartość jeden, a następnie jedno wystąpienie CStringT jest przy użyciu buforu.Ponadto wystąpienie może odczytywać i modyfikować zawartość buforu.Jeśli wartość jest większa niż jeden, wiele wystąpień CStringT można użyć buforu.Ponieważ bufor znaków jest udostępniony, CStringT wystąpienia można jedynie odczytywać zawartość buforu.Aby zmodyfikować zawartość, CStringT najpierw tworzy kopię buforu.Jeśli wartość jest ujemna, tylko jedno wystąpienie CStringT jest przy użyciu buforu.W tym przypadku za bufor zablokowany.Gdy CStringT wystąpienie używa buforu zablokowane inne wystąpienia z CStringT może udostępnić buforu.Zamiast tego te wystąpienia utworzyć kopię bufor przed użyciem zawartość.Ponadto CStringT instancji przy użyciu buforu zablokowanej nie próbuje udostępnić buforu wszelkich innych CStringT instancji.W przypadku CStringT instancji kopiuje inny ciąg do buforu zablokowane.
Przydzielanie CStringData strukturę, należy ustawić to pole, aby odzwierciedlać typ udostępniania jest dozwolone dla buforu.W większości implementacji ustawić wartość jeden.Umożliwia to zwykłe zachowanie udostępniania kopiowania przy zapisie.Jednak jeśli Menedżera ciąg nie obsługuje udostępniania buforu ciągów, należy ustawić to pole Stan zablokowane.Zmusza to CStringT używać tylko bufor dla wystąpienia CStringT on przydzielone.