为什么 COM IUnknown::Release 的这个实现可以工作?

2023-11-22

从例子中我看到了COMIUnknown::Release()函数的实现是这样的:

ULONG Release()
{
    InterlockedDecrement(&m_count);
    if(m_count == 0) {
       delete this;
    }
    return m_count;
}

因此,如果 m_count 为 0,那么我们将删除“this”对象,并返回引用计数。 我不明白的是为什么它有效?!?!

  1. 删除对象不会破坏调用堆栈,或者可以,因为它由线程持有,所以它与对象无关???

  2. 如果对象已经被删除了,我们怎么可能返回m_count呢,它应该已经被删除了。我本可以说服自己,删除后代码返回硬编码的 0 是可以的,但是它怎么能返回成员呢?!?!

非常感谢你的帮助! :-)


该代码是假的。永远不能相信 m_countafter的减量。正确的代码是always像这样:

ULONG Release()
{
     ULONG count = InterlockedDecrement(&m_count);
     if(count == 0){ delete this; }
     return count;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么 COM IUnknown::Release 的这个实现可以工作? 的相关文章

随机推荐