Microsoft对象,Release()函数返回值?

twe*_*ypi 6 c++ com directx pointers reference-counting

我很好奇,因为我在MSDN上找不到这个.我发现该Release()函数存在于各种COM对象中,我显然应该用它来删除指针.但我不确定它到底是什么回报?我以前认为它会返回剩余对象仍然存在的引用数,因此类似于:

while( pointer->Release() > 0 );
Run Code Online (Sandbox Code Playgroud)

显然会释放对该指针的所有引用?

或者我没有看到什么?

*注意我正在从IDirect3DTexture9::Release()功能的概念谈论这个

Mic*_*ael 11

除了Mehrdad所说的,Release的返回值仅用于调试目的.生产代码应该忽略它.

循环直到Release()返回0肯定是一个错误 - 你永远不应该发布你不拥有的引用.


Meh*_*ari 10

你的理论是对的.COM内存管理基于引用计数.该Release方法IUnknown的接口将递减引用计数并返回.该函数不会发布引用.它不知道谁拥有参考.它只是递减引用计数,直到它达到零,然后对象将被破坏.这是危险的,因为其他人可能仍然持有对象的引用,在对象被破坏后它将变为无效.

因此,您应该只调用之前调用Release的每个AddRef.


aJ.*_*aJ. 6

Release()将返回对象的当前引用计数.但你不应该这样做:

while( pointer->Release() > 0 );
Run Code Online (Sandbox Code Playgroud)

这将使引用计数为零并销毁对象.

在COM中,一个简单的拇指规则是每个AddRef()应该有相应的Release()(只有一个).

通常,Release()实现看起来像这样:

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