Implementieren der Referenzzählung
Die Referenzzählung erfordert Sowohl die Arbeit des Implementors einer Klasse als auch der Clients, die Objekte dieser Klasse verwenden. Wenn Sie eine Klasse implementieren, müssen Sie die Methoden AddRef und Release als Teil der IUnknown-Schnittstelle implementieren. Diese beiden Methoden verfügen über die folgenden einfachen Implementierungen:
- AddRef erhöht die interne Verweisanzahl des Objekts.
- Release verringert zuerst die interne Verweisanzahl des Objekts und überprüft dann, ob die Verweisanzahl auf 0 gesunken ist. Wenn dies der Fall ist, bedeutet dies, dass das Objekt nicht mehr verwendet wird, sodass die Release-Funktion das Objekt zugeordnet.
Ein gängiger Implementierungsansatz für die meisten Objekte besteht darin, nur über eine Implementierung dieser Methoden (zusammen mit QueryInterface) zu verfügen, die von allen Schnittstellen gemeinsam genutzt wird, und daher eine Verweisanzahl, die für das gesamte Objekt gilt. Aus Sicht eines Clients ist das Verweiszählen jedoch strikt und eindeutig ein Konzept pro Schnittstelle, und daher können Objekte implementiert werden, die diese Funktion nutzen, indem sie Teile ihrer Funktionalität basierend auf den derzeit existierenden Schnittstellenzeigern dynamisch erstellen, zerstören, laden oder entladen. Diese werden umgangssprachlich als Tear-Off-Schnittstellen bezeichnet.
Wenn ein Client eine Methode (oder API-Funktion) aufruft, z. B . QueryInterface, die einen neuen Schnittstellenzeiger zurückgibt, ist die aufgerufene Methode für die Inkrementierung der Verweisanzahl über den zurückgegebenen Zeiger verantwortlich. Wenn ein Client beispielsweise zum ersten Mal ein -Objekt erstellt, empfängt er einen Schnittstellenzeiger auf ein Objekt, das aus Sicht des Clients eine Referenzanzahl von 1 aufweist. Wenn der Client dann AddRef auf dem Schnittstellenzeiger aufruft, wird die Verweisanzahl auf zwei festgelegt. Der Client muss Release zweimal auf dem Schnittstellenzeiger aufrufen, um alle Verweise auf das Objekt zu löschen.
Ein Beispiel dafür, wie Verweisanzahlen strikt pro Schnittstellenzeiger sind, tritt auf, wenn ein Client QueryInterface auf dem ersten Zeiger für eine neue Schnittstelle oder dieselbe Schnittstelle aufruft. In beiden Fällen muss der Client release für jeden Zeiger einmal aufrufen. COM erfordert nicht, dass ein Objekt denselben Zeiger zurückgibt, wenn es mehrmals nach derselben Schnittstelle gefragt wird. (Die einzige Ausnahme ist eine Abfrage an IUnknown, die ein Objekt für COM identifiziert.) Dadurch kann die Objektimplementierung Ressourcen effizient verwalten.
Threadsicherheit ist auch ein wichtiges Thema bei der Implementierung von AddRef und Release. Weitere Informationen finden Sie unter Prozesse, Threads und Apartments.
Zugehörige Themen