2009-05-20 47 views
6

我很好奇,因为我无法在MSDN上了解到这一点。我发现Release()函数存在于我明显应该用于删除指针的各种COM对象中。但我不确定它究竟返回了什么?我曾经以为它会返回仍然存在剩余的对象引用的数量,因此是这样的:Microsoft对象,Release()函数返回值?

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

显然释放到该指针的所有引用?

还是我没有看到什么?

*注意我是从IDirect3DTexture9::Release()功能

回答

10

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

因此,您应该只为以前调用的每个AddRef调用Release

11

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

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

6

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

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

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

在COM一个简单的经验法则是每一个的AddRef() 应该有相应的 发行()(只有一个)。

通常发行()实施应该是这样的:

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