Referans sayımı kuralları

Makale çevirileri Makale çevirileri
Makale numarası: 104138 - Bu makalenin geçerli olduğu ürünleri görün.
Hepsini aç | Hepsini kapa

Bu Sayfada

Özet

Bileşen Nesne modeli, bir arabirimin yaşam süresi, başvuru sayma ile denetlenir. Bir arabirim için başvuru sayısı, ıunknown ' devralınmış AddRef() ve Release() üye işlevleri üzerinden yönetilen. Bir arabirimin başvuru sayısı ve Release() yöntemi azaltır AddRef() üye artırır. Bir arabirimin başvuru sayısı sıfır olarak gider sonra yoktur artık bu arabirim için herhangi bir geçerli işaretçi. Tüm nesne arabirimleri başvuru sayısı sıfırsa, artık olduğundan nesneye bir işaretçi sonra nesne serbest.

Daha fazla bilgi

Referans sayımı kuralları

Aşağıdaki liste, gelmelidir (83 ve OLE 2.0 belirtimi 84 sayfalarından alınan) kurallar sayım başvuru bir kopyasıdır. Küçük kod örnekleri, kuralları açıklığa kavuşturmak amacıyla bu makaledeki eklenmiştir.

  1. Her yeni bir kopyasını bir arabirim işaretçisi () 'd AddRef olmalıdır ve her bir arabirim işaretçisi bozma Release () hariç olmalıdır burada sonra gelen kuralları yürütme açıkça tersi izin.

    1. Giden Parametreler işlevlerine: çağıran AddRef() gerçek parametre gerekir, çünkü onu Release () out-value üstünde depolandığında tarafından Aranan 'd.
            LPOLEOBJECT lpObject;
               .
               .  // Get pointer to IOleObject.
               .
            LPVIEWOBJECT lpView = lpObject;
      
            lpObject->AddRef()
      
            // GetViewObject is a theoretical function that takes a
            // pointer to anything derived from IUnknown, and then
            // returns a pointer to IViewObject in the same variable
            // passed as the parameter. The AddRef() above is needed so
            // that the original pointer to IOleObject is not freed.
      
            GetViewObject(lpView);
      								
    2. Genel değişken alınıyor: Varolan bir işaretçiyi bir genel değişkende kopyasından getirilen bir arabirim işaretçisi yerel kopyasını yerel kopyası hala canlı olduğu sırada işlevleri denir, çünkü sayılan başvuru genel kopya yıkmak bağımsız olması gerekir.
            void function()
            {
            // Get a pointer to IOleObject from a global variable.
            LPOLEOBJECT lpOleObject = glpObject;
      
            // This AddRef() is needed so that the interface
            // pointed to by the global variable, glpObject,
            // does not get released by a different part of
            // the applications code.
      
            lpOleObject->AddRef();
               .
               . // use lpOleObject;
               .
            lpOleObject->Release();
            }
      								
    3. "Ince hava" dışında oluşturulan yeni işaretçiler: bir arabirim işaretçisi, diğer bir kaynaktan alma, bir başlangıç AddRef() birleştirilmiş olan yeni işaretçi üzerinde yapmalısınız özel iç bilgi yerine synthesizes BIR işlev. Önemli Bu tür yordamlar örnek oluşturma yordamları IUnknown::QueryInterface vb. uygulamaları örnekleridir.
            STDMETHDOIMP IUnknown::QueryInteface( REFIID iidInterface,
                                               LPVOID FAR *ppvObj)
            {
            *ppvObj = NULL;
            SCODE sc = E_NOINTERFACE;
      
            if (iidInterface == IUnknown)
                {
                *ppvObj = this;
      
                // This AddRef() is needed because a new pointer
                // was just created.
      
                AddRef();
               sc = S_OK;
                }
      
            return ResultFromScode(sc);
            }
      								
    4. Dahili olarak depolanmış bir işaretçi bir kopyasını döndürülüyor: işaretçiyi döndürdü, once, Aranan ömrü boyunca, işaretçiyi dahili olarak depolanmış bir kopyasını nasıl ilişkili olduğu bir fikir vardır. Bu nedenle, Aranan işaretçiyi kopyalama dönmeden önce AddRef() gerekir.
            // m_lpOleObject is a private member variable of a C++ class.
            // GetOleObject is a member function to return access to this
            // pointer.
      
            void GetOleObject (LPVOID FAR *ppObject)
            {
                *ppObject = m_lpOleObject;
      
                // This AddRef() is needed due to this rule.
      
                m_lpOleObject->AddRef();
             }
      								
  2. Bir parça kodu üzerinde bölümüne, özel bilgi beginnings ve yaşam süreleri'bir arabirim işaretçisi iki veya daha fazla kopyasını, bitişlerini ilişkileriyle ilgili AddRef()/Release() verebilir atlanmış için çiftleri.

    1. De-Parametreler işlevlerine: bir işleve geçirilen gerçek bir parametresi olarak bir arabirim işaretçisi kopyasını işaretçisinin değeri'ni başlatmak için kullanılan, iç içe bir yaşam süresi vardır. Bu nedenle, gerçek parametre ayrı olarak sayılan başvuru olması gerekir.
            void function (LPOLEOBJECT lpOleObject)
            {
      
            // Can use lpOleObject in this function
            // without doing AddRef() and Release().
      
            }
      								
    2. Çıkış parametreleri işlevler, dönüş değerleri de dahil olmak üzere: out parametresi ayarlamak için <a0></a0>, işlev kendisi tarafından kural 1 arabirim işaretçisi kararlı bir kopyası olmalıdır. Çıkışta, işaretçinin serbest bırakılması sorumluluğunu Aranan çağrıyı transfer edilir. Bu nedenle, out parametresi olmayan başvuru sayılan.
            LPVIEWOBJECT lpView;
      
            HERROR hErr = lpOleObject->QueryInterface(IID_IViewObject,
                                                      (LPVOID FAR *)lpView);
      
            if (hErr = NOERROR)
                {
                // The QueryInterface succeeded. lpView does not have
                // to be AddRef()'d because it has already been done
                // by the QueryInterface method.
                }
      								
    3. Yerel değişken: BIR işlev uygulaması, açıkça her çerçevede yığın için ayrılan işaretçisini değişken ömürleri omniscient bilgiye sahiptir. Yedek AddRef()/Release() çiftleri atlamak için bu bilgi bu nedenle kullanabilirsiniz.
            void function()
            {
            LPOLEOBJECT lpTempObject;
               .
               .
               .
            lpTempObject = lpObject;
               .
               .  // lpTempObject can be used
               .  // without reference counting as long as
               .  // it is known that the lifetime of lpObject
               .  // outside of this function call.
               .
            }
      								
    4. Backpointers: bazı veri yapısı, A ve B, diğer bir işaretçi her iki bileşen içeren yapılardır. Yaşam süresi (A) bir bileşeninin yaşam süresini diğer (B) içeren bilinmektedir ve işaretçiyi ikinci bileşeninden yedeklemek için ilk, (A B tarafından) değil başvuru sayılması. Genellikle, aksi taktirde oluşturulacak döngüsü önleme boşaltılırken uygun davranış Bakımı de önemlidir.

Özellikler

Makale numarası: 104138 - Last Review: 3 Aralık 2003 Çarşamba - Gözden geçirme: 3.1
Bu makaledeki bilginin uygulandığı durum:
  • Microsoft OLE 2.0
  • Microsoft OLE 4.0, Ne zaman ne ile kullanilir:
    • Microsoft Windows NT 4.0
    • Microsoft Windows NT 3.51 Service Pack 5
    • Microsoft Windows NT 4.0
    • Microsoft Windows 95
    • the operating system: Microsoft Windows 2000
Anahtar Kelimeler: 
kbmt kbprogramming KB104138 KbMttr
Machine-translated Article
ÖNEMLİ: Bu makale, bir kişi tarafından çevrilmek yerine, Microsoft makine-çevirisi yazılımı ile çevrilmiştir. Microsoft size hem kişiler tarafından çevrilmiş, hem de makine-çevrisi ile çevrilmiş makaleler sunar. Böylelikle, bilgi bankamızdaki tüm makalelere, kendi dilinizde ulaşmış olursunuz. Bununla birlikte, makine tarafından çevrilmiş makaleler mükemmel değildir. Bir yabancının sizin dilinizde konuşurken yapabileceği hatalar gibi, makale; kelime dağarcığı, söz dizim kuralları veya dil bilgisi açısından yanlışlar içerebilir. Microsoft, içeriğin yanlış çevrimi veya onun müşteri tarafından kullanımından doğan; kusur, hata veya zarardan sorumlu değildir. Microsoft ayrıca makine çevirisi yazılımını sıkça güncellemektedir.
Makalenin İngilizcesi aşağıdaki gibidir:104138

Geri Bildirim Ver

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com