Aracılığıyla paylaş


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. CFixedStringTCStringT'den türetilir ve dize, şablon parametresi CFixedStringTtarafı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 ReAllocateile 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 CStringTbire 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

Ayrıca bkz.

CStringT ile Bellek Yönetimi