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()(只有一个)。

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

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