2009-05-20 3 views
6

Ich bin neugierig, weil ich dies auf MSDN nicht herausfinden konnte. Ich habe gefunden, dass die Release() Funktion in verschiedenen COM-Objekten vorhanden ist, die ich offensichtlich zum Löschen von Zeigern verwenden soll. Aber ich bin mir nicht sicher, was es genau zurückgibt? Ich benutzte es, zu denken, würde die Anzahl der Referenzen zurück, die noch auf das Objekt existieren noch, also so etwas wie:Microsoft-Objekte, die Release() -Funktion gibt Wert zurück?

while(pointer->Release() > 0); 

freisetzen würde offensichtlich alle Verweise auf diesen Zeiger?

Oder sehe ich nicht etwas?

* Anmerkung ich darüber von dem Konzept der IDirect3DTexture9::Release() Funktion rede

Antwort

10

Ihre Theorie ist wahr. Die COM-Speicherverwaltung basiert auf der Referenzzählung. Die Release Methode der Schnittstelle IUnknown dekrementiert die Referenzzählung und gibt sie zurück. Diese Funktion gibt Referenzen nicht frei. Es weiß nicht, wer die Referenz hält. Es verringert nur die Referenzzählung, bis es Null erreicht, und dann wird das Objekt zerstört. Es ist gefährlich, da andere möglicherweise noch einen Hinweis darauf haben, der nach der Zerstörung des Objekts ungültig wird.

Daher sollten Sie nur anrufen Release für jede AddRef, die Sie zuvor aufgerufen haben.

11

Zusätzlich zu dem, was Mehrdad sagte, ist der Rückgabewert von Release nur für Debugging-Zwecke gedacht. Produktionscode sollte es einfach ignorieren.

Looping, bis Release() 0 zurückgibt, ist definitiv ein Fehler - Sie sollten niemals Referenzen freigeben, die Sie nicht besitzen.

6

Release() würde die aktuelle Referenzzahl des Objekts zurückgeben. Aber Sie sollten nicht tun:

while(pointer->Release() > 0); 

Dies wird die Referenz Null zählen und das Objekt zu zerstören.

In COM eine einfache Faustregel ist jede AddRef() dort Veröffentlichung entspricht() (nur eine) werden soll.

Normalerweise Release() Implementierung würde wie folgt aussehen:

int nCount = InterlockedDecrement(&this->m_cRef); //Decrement the ref count 
if (nCount == 0) 
{ 
    delete this; 
} 
return nCount;