Выпуск умных указателей в FinalRelease явно - PullRequest
0 голосов
/ 28 февраля 2012

Некоторые классы проекта, над которыми я работаю, выглядят так:

class ATLCOMCLASS<CComObjectRootEx<ATLCOMCLASS> >
{
  ISomeInterfacePtr p;
  /*some stuff*/
  void FinalRelease()
  {
    p = NULL;
  }
}

ISomeInterfacePtr определяется как _COM_SMARTPTR_TYPEDEF.Я не понимаю, почему нужно явно делать p = NULL, что означает p->Release(), если эта операция будет выполняться в ATLCOMCLASS dtor автоматически.

Не могли бы вы объяснить, пожалуйста?

1 Ответ

1 голос
/ 28 февраля 2012

Технически, не имеет для выполнения p = NULL в этой точке кода или явно в любой точке, потому что деструктор освободит умный указатель, как вы заметили.Тем не менее, явное его освобождение дает вам более точный контроль над , когда происходит, что может быть полезно.

В зависимости от требований ISomeInterface, программы и других факторов, освобождение p до уничтожения this может удовлетворять некоторым условиям программы.В частности, если FinalRelease() вызывается другим методом, а не dtor, то очистка происходит где-то еще и, вероятно, имеет совсем другой триггер.Он также может быть очищен, а затем некоторые ресурсы воссозданы в виде сброса или любого количества других последовательностей.

Чтобы точно выяснить, почему это полезно, при условии, что это не ошибка, вам необходимовернитесь к возможному потоку программ и посмотрите, что происходит.

...