7

MSDNでこれについて知ることができなかったので、私は興味があります。Release()この関数は、ポインターを削除するために使用するはずのさまざまな COM オブジェクトに存在することがわかりました。しかし、それが正確に何を返すのかわかりませんか?私は、残りのオブジェクトにまだ存在する参照の数を返すと思っていたので、次のようになります。

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

そのポインターへのすべての参照を明らかに解放しますか?

それとも私は何かを見ていませんか?

IDirect3DTexture9::Release()*関数の概念からこれについて話していることに注意してください

4

3 に答える 3

11

Mehrdad が言ったことに加えて、Release の戻り値はデバッグのみを目的としています。本番コードはそれを無視する必要があります。

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

于 2009-05-20T15:45:07.757 に答える
10

あなたの理論は正しいです。COM メモリ管理は、参照カウントに基づいています。インターフェイスのReleaseメソッドはIUnknown、参照カウントをデクリメントして返します。その関数は参照を解放しません。誰が参照を保持しているかはわかりません。ゼロになるまで参照カウントを減らすだけで、オブジェクトは破棄されます。オブジェクトの破棄後に無効になる参照を他の人がまだ保持している可能性があるため、危険です。

したがって、以前に呼び出しReleaseたそれぞれに対してのみ呼び出す必要があります。AddRef

于 2009-05-20T15:41:02.743 に答える
6

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

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

これにより、参照カウントがゼロになり、オブジェクトが破棄されます。

COM では、簡単な経験則として、すべての AddRef() に対応する Release() が必要です (1 つだけ)。

通常、Release() の実装は次のようになります。

int nCount = InterlockedDecrement(&this->m_cRef); //Decrement the ref count
if (nCount == 0) 
{
    delete this;
}
return nCount; 
于 2009-05-20T15:46:07.570 に答える