Megosztás a következőn keresztül:


Referenciaszámlálás implementálása

A referenciaszámláláshoz az osztály implementátorának és az osztály objektumait használó ügyfeleknek egyaránt dolgoznia kell. Az osztály implementálásakor az AddRef és Kiadási metódusokat kell implementálnia az IUnknown felület részeként. Ez a két módszer a következő egyszerű implementációkkal rendelkezik:

  • AddRef növeli az objektum belső hivatkozásainak számát.
  • Kiadás először az objektum belső hivatkozásainak számát mérsékeli, majd ellenőrzi, hogy a hivatkozási szám nullára csökkent-e. Ha igen, az azt jelenti, hogy már senki sem használja az objektumot, így a Release függvény felszabadítja az objektumot.

A legtöbb objektum közös implementálási megközelítése, hogy ezeknek a metódusoknak csak egy implementációja van (QueryInterface), amely minden interfész között meg van osztva, és ezért a hivatkozási szám az egész objektumra vonatkozik. Az ügyfél szempontjából azonban a hivatkozásszámlálás szigorúan és egyértelműen interfész-mutatónkénti fogalmat jelent, ezért olyan objektumok implementálhatók, amelyek kihasználják ezt a képességet azáltal, hogy a funkciójuk egyes részeit dinamikusan építik fel, pusztítják el, betöltik vagy ürítik ki a jelenleg meglévő felületmutatók alapján. Ezeket köznyelvileg nevezik szakadó felületeknek.

Amikor egy ügyfél meghív egy metódust (vagy API-függvényt), például QueryInterface, amely egy új felületmutatót ad vissza, a meghívott metódus felelős a hivatkozásszám növeléséért a visszaadott mutatón keresztül. Amikor például egy ügyfél először hoz létre egy objektumot, egy olyan objektumra mutató illesztőmutatót kap, amely az ügyfél szempontjából egy hivatkozásszámmal rendelkezik. Ha az ügyfél ezután meghívja AddRef a felületmutatón, a referenciaszám kettő lesz. Az ügyfélnek kétszer kell meghívnia Release az interfészmutatón, hogy az összes hivatkozását az objektumra dobja.

Példa arra, hogy a hivatkozási számok szigorúan interfész mutatónként érvényesek, amikor az ügyfél meghívja a QueryInterface függvényt az első mutatóra, akár egy új interfészhez, akár ugyanahhoz az interfészhez. Ezen esetekben az ügyfélnek minden egyes mutatóhoz egyszer meg kell hívnia Release. A COM nem követeli meg, hogy egy objektum ugyanazt a mutatót adja vissza, amikor többször is ugyanazt a felületet kéri. (Ez alól az egyetlen kivétel az IUnknownlekérdezése, amely a COM objektumát azonosítja.) Ez lehetővé teszi, hogy az objektum implementációja hatékonyan kezelje az erőforrásokat.

A szálbiztonság szintén fontos kérdés az AddRef és a Releaseimplementálásában. További információ: folyamatok, szálak és apartmanok.

Objektumok élettartamának kezelése hivatkozásszámlálás által