Требуется ли для добавления умного указателя на _variant_t ручной AddRef ()? - PullRequest
1 голос
/ 21 сентября 2011

Вот пример фрагмента:

_variant_t var;

var.vt = VT_UNKNOWN;

var.punkVal = unknownInterfaceSmartPointer;

unknownInterfaceSmartPointer->AddRef(); // Question Statement

// Setting unknownInterfaceSmartPointer to some other container

Действительно ли здесь нужен ручной AddRef? Следующий способ лучше, чем этот:

_variant_t var(unknownInterfaceSmartPointer.GetInterfacePointer());

ваши мысли?

1 Ответ

1 голос
/ 21 сентября 2011

Если вы напрямую назначаете участника punkVal (как в вашем первом фрагменте), тогда вам нужен AddRef() - никто не сделает это за вас.Гораздо лучше было бы использовать operator=() член _variant_t:

_variant_t var;
var = unknownInterfaceSmartPointer.GetInterfacePointer();

или сделать так, как вы предлагаете, - использовать конструктор преобразования:

_variant_t var(unknownInterfaceSmartPointer.GetInterfacePointer());

Оба последних вариантахорошо и не требует AddRef() в вашем коде - это будет сделано внутри _variant_t реализации.Кроме того, они полезны, потому что если вы переназначите тот же вариант, реализация выполнит для вас правильную очистку:

_variant_t var;
// if you assign a BSTR or smart pointer here
// you want it to be properly released later
var = whatever1();
// this will do the proper release of the previously
// stored stuff and then assign the new value
var = whatever2();
...