Вопрос о Выпуске COM () метод

Я узнаю о COM и читаю об этом коде:

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

Мой вопрос, если m_refCount == 0 и объект удален, как мог, переменная члена экземпляра m_refCount все еще существует и быть возвращенной? Простите мне, если моим вопросом является настолько наивная причина, я полностью новичок на COM.Большое спасибо.

Связанный поток здесь: Как членский метод мог удалить объект?

5
задан Community 23 May 2017 в 12:06
поделиться

2 ответа

Ваше беспокойство справедливо, счетчик ссылок должен быть перенесен в локальную переменную перед удалением объекта.

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);
  }
6
ответ дан 14 December 2019 в 08:49
поделиться

Вы уверены, что функция возвращает m_refCount ?

Я считаю, что доступ к переменным-членам или методам после удаления объекта не определен в соответствии со стандартом, и вы никогда не сможете сделать это надежно .

Я думаю, это может сработать только тогда, когда метод Release () создает локальную переменную в стеке с копией счетчика ссылок, и это возвращается через оптимизацию возвращаемого значения . .

1
ответ дан 14 December 2019 в 08:49
поделиться
Другие вопросы по тегам:

Похожие вопросы: