Где разместить код деструктора для COM-объекта ATL? - PullRequest
4 голосов
/ 16 февраля 2012

Куда относится код деструктора для вещей, которые я определил в COM-объекте ATL?

Должен ли он идти в ~MyComClass() или в MyComClass::FinalRelease()?

Ответы [ 2 ]

10 голосов
/ 16 февраля 2012

Пока вопрос FinalRelease, я предполагаю, что ваш вопрос связан с ATL.

В большинстве случаев вы можете убрать вещи в любом из двух.FinalRelease будет вызвано непосредственно перед фактическим деструктором.Важным отличием является то, что если вы объединяете другие объекты, FinalRelease дает вам возможность очистить ссылки и освободить зависимости до того, как фактический деструктор класса COM-объектов верхнего уровня (особенно CComObject) начнет работать.

То есть вы очищаете вещи в два этапа: сначала ссылки на агрегированные объекты в FinalRelease, а затем другие вещи в FinalRelease или деструкторе.

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

Это общий подход:

MyComClass::~MyComClass()
{
    // Cleanup object resources in here.
}

ULONG __stdcall MyComClass::Release()
{
    ref_count_--;

    if (0 == ref_count_)
    {
        delete this;
        return 0;
    }

    return ref_count_;
}

РЕДАКТИРОВАТЬ: FinalRelease(), похоже, связано с ATL, с которым я незнаком.

...