我很好奇,因为我在 MSDN 上找不到这个。我发现该Release()
函数存在于各种 COM 对象中,我显然应该使用这些对象来删除指针。但我不确定它到底返回了什么?我曾经认为它会返回仍然存在的对剩余对象的引用数,因此类似于:
while( pointer->Release() > 0 );
显然会释放对该指针的所有引用吗?
还是我什么都没看到?
*注意我是从IDirect3DTexture9::Release()
函数的概念说的
我很好奇,因为我在 MSDN 上找不到这个。我发现该Release()
函数存在于各种 COM 对象中,我显然应该使用这些对象来删除指针。但我不确定它到底返回了什么?我曾经认为它会返回仍然存在的对剩余对象的引用数,因此类似于:
while( pointer->Release() > 0 );
显然会释放对该指针的所有引用吗?
还是我什么都没看到?
*注意我是从IDirect3DTexture9::Release()
函数的概念说的
除了 Mehrdad 所说的,Release 的返回值仅用于调试目的。生产代码应该忽略它。
循环直到 Release() 返回 0 绝对是一个错误——你永远不应该释放你不拥有的引用。
你的理论是正确的。COM 内存管理基于引用计数。接口的Release
方法IUnknown
将减少引用计数并返回它。该函数不会释放引用。它不知道谁持有参考。它只是减少引用计数,直到它达到零,然后对象将被破坏。这是危险的,因为其他人可能仍然持有对它的引用,该引用在对象销毁后将变为无效。
因此,您应该只为您之前调用Release
的每个调用。AddRef
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;