为什么COM IUnknown :: Release的实现有效?

TCS*_*TCS 6 c++ windows com

从示例中我看到COM IUnknown::Release()函数实现是这样的:

ULONG Release()
{
    InterlockedDecrement(&m_count);
    if(m_count == 0) {
       delete this;
    }
    return m_count;
}
Run Code Online (Sandbox Code Playgroud)

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

  1. 删除对象不会破坏调用堆栈,也可以,因为它是由线程保存的,所以它与对象无关???

  2. 如果对象已被删除,我们怎么可能返回m_count,它应该被删除.我可以说服自己,如果在删除代码后会返回硬编码0,这是可以的,但是为什么它会返回会员?!?!

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

Rem*_*anu 15

那段代码是虚假的.在减量之后永远不能信任m_count .正确的代码总是这样:

ULONG Release()
{
     ULONG count = InterlockedDecrement(&m_count);
     if(count == 0){ delete this; }
     return count;
}
Run Code Online (Sandbox Code Playgroud)

  • 不,我真的是指'减量'之后.在`delete`之后解除引用`this`的问题是显而易见的,不需要重复.但是有一个更微妙的并发问题.你的减量可能会带来计数,比如说2.当你再次触摸m_count时,由于你已经释放了你的计数,*其他*线程可能已经达到0并释放了对象,并且插槽可能甚至被重新分配给别的.因此,在减少*hic sunt leones*之后不要触摸m_count. (6认同)
  • 不,他的意思是减量后.如果多个线程正在访问它,则另一个线程可能也会调用Release,如果在减量和条件之间完成,则使成员变量的值为负. (2认同)