【问题标题】:Microsoft objects, the Release() functions return value?Microsoft 对象,Release() 函数返回值?
【发布时间】:2009-05-20 15:35:57
【问题描述】:
我很好奇,因为我在 MSDN 上找不到这方面的信息。我发现 Release() 函数存在于各种 COM 对象中,我显然应该使用这些对象来删除指针。但我不确定它到底返回了什么?我曾经认为它会返回仍然存在的对剩余对象的引用数,因此类似于:
while( pointer->Release() > 0 );
显然会释放对该指针的所有引用吗?
还是我什么都没看到?
*注意我是从IDirect3DTexture9::Release()函数的概念说的
【问题讨论】:
标签:
c++
com
pointers
directx
reference-counting
【解决方案1】:
除了 Mehrdad 所说的,Release 的返回值仅用于调试目的。生产代码应该忽略它。
循环直到 Release() 返回 0 绝对是一个错误 - 你永远不应该释放你不拥有的引用。
【解决方案2】:
你的理论是正确的。 COM 内存管理基于引用计数。 IUnknown 接口的Release 方法将递减引用计数并返回。该函数不会释放引用。它不知道谁持有参考。它只是减少引用计数,直到它达到零,然后对象将被破坏。这很危险,因为其他人可能仍然持有对它的引用,该引用在对象销毁后将变为无效。
因此,您应该只为您之前调用的每个AddRef 调用Release。
【解决方案3】:
Release() 将返回对象的当前引用计数。但你不应该这样做:
while( pointer->Release() > 0 );
这将使引用计数为零并销毁对象。
在 COM 中,一个简单的经验法则是每个 AddRef()
应该有对应的
Release()(只有一个)。
通常 Release() 实现如下所示:
int nCount = InterlockedDecrement(&this->m_cRef); //Decrement the ref count
if (nCount == 0)
{
delete this;
}
return nCount;