Implementowanie zliczania odwołań
Zliczanie odwołań wymaga pracy zarówno od implementatora klasy, jak i od klientów korzystających z obiektów tej klasy. Podczas implementowania klasy należy zaimplementować metody AddRef i Release w ramach interfejsu IUnknown. Te dwie metody mają następujące proste implementacje:
- addRef zwiększa wewnętrzną liczbę odwołań obiektu.
- release najpierw dekrementuje wewnętrzną liczbę odwołań obiektu, a następnie sprawdza, czy liczba odwołań spadła do zera. Jeśli tak, oznacza to, że nikt już nie używa obiektu, więc funkcja Release dealokuje obiekt.
Typowym podejściem implementacji dla większości obiektów jest posiadanie tylko jednej implementacji tych metod (wraz z QueryInterface), która jest współdzielona między wszystkimi interfejsami, a w związku z tym liczba odwołań, która ma zastosowanie do całego obiektu. Jednak z perspektywy klienta zliczanie odwołań jest ściśle związane z pojęciem wskaźników interfejsu, a zatem można implementować obiekty, które wykorzystują tę możliwość do dynamicznego konstruowania, niszczenia, ładowania lub zwalniania części swojej funkcjonalności na podstawie obecnie aktywnych wskaźników interfejsu. Są to potocznie nazywane interfejsami odrywania.
Za każdym razem, gdy klient wywołuje metodę (lub funkcję interfejsu API), taką jak QueryInterface, która zwraca nowy wskaźnik interfejsu, wywoływana metoda jest odpowiedzialna za zwiększanie liczby odwołań za pośrednictwem zwróconego wskaźnika. Na przykład, gdy klient najpierw tworzy obiekt, otrzymuje wskaźnik interfejsu do obiektu, który z punktu widzenia klienta ma liczbę odwołań równą jeden. Jeśli klient wywołuje AddRef na wskaźniku interfejsu, liczba odwołań wynosi dwa. Klient musi wywołać Release dwa razy na wskaźniku interfejsu, aby usunąć wszystkie odwołania do obiektu.
Przykładem tego, jak liczby odwołań są ściśle w oparciu o wskaźnik interfejsu, ma miejsce, gdy klient wywołuje QueryInterface na pierwszym wskaźniku dla nowego interfejsu lub tego samego interfejsu. W każdym z tych przypadków klient musi wywołać Release raz dla każdego wskaźnika. Com nie wymaga, aby obiekt zwracał ten sam wskaźnik, gdy zostanie wyświetlony monit o ten sam interfejs wielokrotnie. (Jedynym wyjątkiem jest to zapytanie IUnknown, które identyfikuje obiekt com.) Dzięki temu implementacja obiektu umożliwia wydajne zarządzanie zasobami.
Kwestia bezpieczeństwa wątków jest także istotna przy implementacji AddRef oraz Release. Aby uzyskać więcej informacji, zapoznaj się z Procesami, Wątkami i Apartamentami.
Tematy pokrewne
-
Zarządzanie okresami życia obiektów za pomocą zliczania odwołań