twe*_*ypi 6 c++ com directx pointers reference-counting
我很好奇,因为我在MSDN上找不到这个.我发现该Release()函数存在于各种COM对象中,我显然应该用它来删除指针.但我不确定它到底是什么回报?我以前认为它会返回剩余对象仍然存在的引用数,因此类似于:
while( pointer->Release() > 0 );
Run Code Online (Sandbox Code Playgroud)
显然会释放对该指针的所有引用?
或者我没有看到什么?
*注意我正在从IDirect3DTexture9::Release()功能的概念谈论这个
Meh*_*ari 10
你的理论是对的.COM内存管理基于引用计数.该Release方法IUnknown的接口将递减引用计数并返回.该函数不会发布引用.它不知道谁拥有参考.它只是递减引用计数,直到它达到零,然后对象将被破坏.这是危险的,因为其他人可能仍然持有对象的引用,在对象被破坏后它将变为无效.
因此,您应该只调用之前调用Release的每个AddRef.
Release()将返回对象的当前引用计数.但你不应该这样做:
while( pointer->Release() > 0 );
Run Code Online (Sandbox Code Playgroud)
这将使引用计数为零并销毁对象.
在COM中,一个简单的拇指规则是每个AddRef()应该有相应的Release()(只有一个).
通常,Release()实现看起来像这样:
int nCount = InterlockedDecrement(&this->m_cRef); //Decrement the ref count
if (nCount == 0)
{
delete this;
}
return nCount;
Run Code Online (Sandbox Code Playgroud)