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

时间:2009-05-20 15:35:58

标签: c++ com pointers directx reference-counting

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

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

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

或者我没有看到什么?

*注意我正在从IDirect3DTexture9::Release()函数

的概念谈论这个问题

3 个答案:

答案 0 :(得分:11)

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

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

答案 1 :(得分:10)

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

因此,您只应为之前调过的每个Release拨打AddRef

答案 2 :(得分:6)

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

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

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

  

在COM中,每个AddRef()都有一个简单的拇指规则   应该有对应的   发布()(只有一个)。

通常Release()实现如下所示:

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