我很好奇,因为我在MSDN上找不到这个。我发现Release()
函数存在于各种COM对象中,我显然应该用它来删除指针。但我不确定它到底是什么回报?我曾经认为它会返回剩余对象仍然存在的引用数,因此类似于:
while( pointer->Release() > 0 );
显然会释放对该指针的所有引用吗?
或者我没有看到什么?
*注意我正在从IDirect3DTexture9::Release()
函数
答案 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;