2009-05-20 14 views
6

私はMSDNでこれについて知ることができなかったので不思議です。私はRelease()関数が、明らかにポインタを削除するために使用するはずのさまざまなCOMオブジェクトに存在することを発見しました。しかし、私はそれが正確に何を返すのか分からないのですか?Microsoftオブジェクトでは、Release()関数は値を返しますか?

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

、明らかにそのポインタへのすべての参照を解放するだろう:私はそれはまだのようなものは、したがって、残りのオブジェクトに対して存在する参照の数を返すだろうと思うために使用しましたか?

何か見ていないのですか?

*あなたの理論が真であるIDirect3DTexture9::Release()機能

答えて

10

の概念から、私はこのことについて話している注意してください。 COMメモリ管理は参照カウントに基づいています。 IUnknownReleaseメソッドは、参照カウントを減分して返します。その機能はの参照を解放しません。誰が参照を保持しているかはわかりません。それはゼロに達するまで参照カウントを減らし、オブジェクトが破壊されます。オブジェクトの破壊後に無効になる他の人がまだ参照を保持している可能性があるので、危険です。

したがって、以前に電話したAddRefごとにReleaseに電話する必要があります。

11

リリースの戻り値は、Mehrdadが述べたことに加えて、デバッグを目的としたものです。プロダクションコードは無視しなければなりません。

Release()が0を返すまでのループは、間違いなくバグです。自分が所有していない参照を解放しないでください。

6

Release()は、オブジェクトの現在の参照カウントを返します。しかし、あなたはするべきではありません:

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

これは、参照カウントをゼロにしてオブジェクトを破壊します。

はCOMでは、単純な親指のルールは、すべてのAddRef() が リリース()(一つだけ)が対応しなければならないです。

通常リリース()の実装は次のようになります。

int nCount = InterlockedDecrement(&this->m_cRef); //Decrement the ref count 
if (nCount == 0) 
{ 
    delete this; 
} 
return nCount; 
関連する問題