我正在学习COM并阅读有关此代码的内容:
STDMETHODIMP_ (ULONG) ComCar::Release()
{
if(--m_refCount==0) delete this;
return m_refCount;
}
我的问题是,如果m_refCount == 0并删除了对象,实例成员变量 m_refCount 如何仍然存在并被返回?如果我的问题太天真,请原谅我,因为我是COM的新手。非常感谢。
答案 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返回。