关于COM Release()方法的问题

时间:2010-02-22 03:40:43

标签: c++ com

我正在学习COM并阅读有关此代码的内容:

    STDMETHODIMP_ (ULONG) ComCar::Release()
{
   if(--m_refCount==0) delete this;
   return m_refCount;
}

我的问题是,如果m_refCount == 0并删除了对象,实例成员变量 m_refCount 如何仍然存在并被返回?如果我的问题太天真,请原谅我,因为我是COM的新手。非常感谢。

相关主题在这里:How could a member method delete the object?

2 个答案:

答案 0 :(得分:6)

您的担忧是有效的,在删除对象之前,应将引用计数移动到局部变量中。

STDMETHODIMP_ (ULONG) ComCar::Release()
{
   ULONG refCount = --m_refCount; // not thread safe
   if(refcount==0) delete this;
   return refCount;
}

但是即使代码仍然是错误的,因为它不是线程安全的。

你应该使用这样的代码。

  STDMETHODIMP_ (ULONG) ComCar::Release()
  {
     LONG cRefs = InterlockedDecrement((LONG*)&m_refCount);
     if (0 == cRefs) delete this;
     return (ULONG)max(cRefs, 0);
  }

答案 1 :(得分:1)

您确定该功能正在返回m_refCount吗?

我认为在删除对象后访问成员变量或方法是根据标准未定义的,你永远无法可靠地执行此操作。

我认为这可行的唯一方法是Release()方法在堆栈上使用引用计数的副本创建局部变量,并通过return value optimization返回。