CFixedStringT: Örnek Özel Dize Yöneticisi
ATL kitaplığı, CFixedStringT sınıfı tarafından kullanılan ve CFixedStringMgr adlı bir özel dize yöneticisi örneği uygular. CFixedStringT
CStringT'den türetilir ve dize, şablon parametresi CFixedStringT
tarafından t_nChars
belirtilen uzunluktan küçük olduğu sürece karakter verilerini nesnenin bir parçası CFixedStringT
olarak ayıran bir dize uygular. Bu yaklaşımda, dizenin uzunluğu sabit arabelleğin boyutunun ötesine geçmediği sürece dizenin yığına hiç ihtiyacı yoktur. Dize CFixedStringT
verilerini ayırmak için her zaman bir yığın kullanmadığından, dize yöneticisi olarak kullanamaz CAtlStringMgr
. IAtlStringMgr arabirimini uygulayan bir özel dize yöneticisi ()CFixedStringMgr
kullanır. Bu arabirim, Özel Dize Yöneticisi 'nin (Gelişmiş Yöntem) Uygulanması bölümünde açıklandı.
oluşturucu CFixedStringMgr
üç parametre alır:
pData: Kullanılacak sabit
CStringData
yapıya ilişkin bir işaretçi.nChars: Yapının tutabileceği karakter
CStringData
sayısı üst sınırı.pMgr: "Yedekleme dizesi yöneticisi" arabiriminin işaretçisi
IAtlStringMgr
.
Oluşturucu, pData ve pMgr değerlerini ilgili üye değişkenlerinde (m_pData
ve m_pMgr
) depolar. Ardından arabelleğin uzunluğunu sıfır, kullanılabilir uzunluğu sabit arabelleğin en büyük boyutuna eşit ve başvuru sayısını -1 olarak ayarlar. Başvuru sayısı değeri, arabelleğin kilitlendiğini ve bu örneğinin CFixedStringMgr
dize yöneticisi olarak kullanılacağını belirtir.
Arabelleği kilitli olarak işaretlemek, diğer CStringT
örneklerin arabelleğe paylaşılan bir başvuru tutmasını önler. Diğer CStringT
örneklerin arabelleği paylaşmasına izin verilseydi, diğer dizeler arabelleği kullanmaya devam ederken tarafından kapsanan CFixedStringT
arabelleğin silinmesi mümkün olurdu.
CFixedStringMgr
arabiriminin IAtlStringMgr
tam bir uygulamasıdır. Her yöntemin uygulanması ayrı olarak ele alınmıştı.
CFixedStringMgr::Allocate Uygulamasının Uygulanması
İlk uygulamanın uygulanması CFixedStringMgr::Allocate
, istenen dize boyutunun sabit arabelleğin boyutuna (üyede m_pData
depolanır) eşit veya daha küçük olup olmadığını denetler. Sabit arabellek yeterince büyükse, CFixedStringMgr
sabit arabelleği sıfır uzunluğuyla kilitler. Dize uzunluğu sabit arabellek boyutunun ötesine geçmediği sürece arabelleği CStringT
yeniden ayırmanız gerekmez.
Dizenin istenen boyutu sabit arabellekten CFixedStringMgr
büyükse isteği yedekleme dizesi yöneticisine iletir. Yedekleme dizesi yöneticisinin öbekten arabelleği ayırdığı varsayılır. Ancak, bu arabelleği döndürmeden önce arabelleği CFixedStringMgr
kilitler ve arabelleğin dize yöneticisi işaretçisini nesneye CFixedStringMgr
yönelik bir işaretçiyle değiştirir. Bu, tarafından arabelleği CStringT
yeniden dağıtmaya veya boşaltmaya yönelik girişimlerin içine CFixedStringMgr
çağrılmasını sağlar.
CFixedStringMgr::ReAllocate Uygulamasının Uygulanması
uygulaması, CFixedStringMgr::ReAllocate
uygulamasına Allocate
çok benzer.
Yeniden tahsis edilen arabellek sabit arabellekse ve istenen arabellek boyutu sabit arabellekten küçükse, ayırma yapılmaz. Ancak, yeniden ayrılan arabellek sabit arabellek değilse, yedekleme yöneticisiyle ayrılmış bir arabellek olmalıdır. Bu durumda yedekleme yöneticisi, arabelleği yeniden dağıtmak için kullanılır.
Yeniden ayrılan arabellek sabit arabellekse ve yeni arabellek boyutu sabit arabelleğe sığamayacak kadar büyükse, CFixedStringMgr
yedekleme yöneticisini kullanarak yeni bir arabellek ayırır. Sabit arabelleğin içeriği daha sonra yeni arabelleğe kopyalanır.
CFixedStringMgr::Free uygulamasının uygulanması
uygulaması CFixedStringMgr::Free
ve ReAllocate
ile Allocate
aynı deseni izler. Serbest durumdaki arabellek sabit arabellekse, yöntemi bunu sıfır uzunluklu kilitli arabelleğe ayarlar. Serbest bırakılan arabellek yedekleme yöneticisiyle ayrılmışsa, CFixedStringMgr
yedekleme yöneticisini kullanarak serbest bırakın.
CFixedStringMgr::Clone uygulamasının uygulanması
uygulaması CFixedStringMgr::Clone
her zaman kendisi yerine yedekleme yöneticisine CFixedStringMgr
bir işaretçi döndürür. Bunun nedeni, her örneğinin CFixedStringMgr
yalnızca tek bir örneğiyle ilişkilendirilebileceğidir CStringT
. Yöneticiyi CStringT
kopyalamaya çalışan diğer tüm örnekler bunun yerine yedekleme yöneticisini almalıdır. Bunun nedeni yedekleme yöneticisinin paylaşılmasını desteklemesidir.
CFixedStringMgr::GetNilString Uygulaması
uygulaması CFixedStringMgr::GetNilString
sabit arabelleği döndürür. ve'in CStringT
bire bir yazışması CFixedStringMgr
nedeniyle, belirli bir örneği CStringT
hiçbir zaman bir kerede birden fazla arabellek kullanmaz. Bu nedenle, bir nil dizesi ve gerçek bir dize arabelleği hiçbir zaman aynı anda gerekli değildir.
Sabit arabellek kullanımda değilken sıfır CFixedStringMgr
uzunlukla başlatıldığından emin olur. Bu, sıfır dizesi olarak kullanılmasını sağlar. Ek bir bonus olarak, nAllocLength
sabit arabelleğin üyesi her zaman sabit arabelleğin tam boyutuna ayarlanır. Bu, CStringT
sıfır dizesi için bile IAtlStringMgr::Reallocate çağrısı yapmadan dizeyi büyütebileceği anlamına gelir.
Gereksinimler
Üst bilgi: cstringt.h