【问题标题】:Microsoft objects, the Release() functions return value?Microsoft 对象,Release() 函数返回值?
【发布时间】:2009-05-20 15:35:57
【问题描述】:

我很好奇,因为我在 MSDN 上找不到这方面的信息。我发现 Release() 函数存在于各种 COM 对象中,我显然应该使用这些对象来删除指针。但我不确定它到底返回了什么?我曾经认为它会返回仍然存在的对剩余对象的引用数,因此类似于:

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

显然会释放对该指针的所有引用吗?

还是我什么都没看到?

*注意我是从IDirect3DTexture9::Release()函数的概念说的

【问题讨论】:

    标签: c++ com pointers directx reference-counting


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

      你的理论是正确的。 COM 内存管理基于引用计数。 IUnknown 接口的Release 方法将递减引用计数并返回。该函数不会释放引用。它不知道谁持有参考。它只是减少引用计数,直到它达到零,然后对象将被破坏。这很危险,因为其他人可能仍然持有对它的引用,该引用在对象销毁后将变为无效。

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

      【讨论】:

        【解决方案3】:

        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; 
        

        【讨论】:

          猜你喜欢
          • 2020-04-23
          • 2017-08-01
          • 1970-01-01
          • 2012-02-29
          • 2021-11-11
          • 2021-08-18
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多