Я узнаю о COM и читаю об этом коде:
STDMETHODIMP_ (ULONG) ComCar::Release()
{
if(--m_refCount==0) delete this;
return m_refCount;
}
Мой вопрос, если m_refCount == 0 и объект удален, как мог, переменная члена экземпляра m_refCount все еще существует и быть возвращенной? Простите мне, если моим вопросом является настолько наивная причина, я полностью новичок на COM.Большое спасибо.
Связанный поток здесь: Как членский метод мог удалить объект?
Ваше беспокойство справедливо, счетчик ссылок должен быть перенесен в локальную переменную перед удалением объекта.
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);
}
Вы уверены, что функция возвращает m_refCount
?
Я считаю, что доступ к переменным-членам или методам после удаления объекта не определен в соответствии со стандартом, и вы никогда не сможете сделать это надежно .
Я думаю, это может сработать только тогда, когда метод Release ()
создает локальную переменную в стеке с копией счетчика ссылок, и это возвращается через оптимизацию возвращаемого значения . .