2009-05-20 4 views
6

Tengo curiosidad porque no pude encontrar esto en MSDN. Descubrí que la función Release() está presente en varios objetos COM que se supone que debo usar para eliminar punteros. Pero no estoy seguro de qué devuelve exactamente? Yo solía pensar que sería devolver el número de referencias que todavía existen para el objeto que queda, por lo tanto, algo así como:Objetos de Microsoft, las funciones Release() devuelven valor?

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

obviamente liberaría todas las referencias a ese puntero?

¿O no estoy viendo algo?

* Nota Estoy hablando de esto desde el concepto de la función IDirect3DTexture9::Release()

Respuesta

10

Su teoría es cierta. La gestión de la memoria COM se basa en el recuento de referencias. El método Release de la interfaz IUnknown disminuirá el recuento de referencias y lo devolverá. Esa función no lanzará referencias. No sabe quién tiene la referencia. Simplemente disminuye la cuenta de referencia hasta que llega a cero y luego el objeto será destruido. Es peligroso, ya que otros aún pueden contener una referencia que se convertirá en inválida después de la destrucción del objeto.

Por lo tanto, solo debe llamar al Release por cada AddRef que haya llamado anteriormente.

11

Además de lo que dijo Mehrdad, el valor de devolución de la versión es solo para fines de depuración. El código de producción debería simplemente ignorarlo.

Looping until Release() devuelve 0 es definitivamente un error - nunca debería liberar las referencias que no le pertenecen.

6

La versión() devolvería el conteo de referencia actual del objeto. Pero no debe hacer:

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

Esto hará que la referencia cuente cero y destruya el objeto.

En COM regla del pulgar simple es cada AddRef() no debería ser correspondientes Release() (sólo uno).

Normalmente Release() aplicación se vería así:

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