поздний ответ, который может не относиться к более ранним (или более поздним) версиям Visual Studio;однако VS 12.0 имеет встроенную реализацию _bstr_t
, и, очевидно, внутренний экземпляр Data_t
создается с m_RefCount
, равным 1, при вызове GetBSTR()
для девственной _bstr_t
.Таким образом, жизненный цикл _bstr_t
в вашем первом примере выглядит нормально:
_bstr_t description;
errorInfo->GetDescription( &description.GetBSTR() );
Но если _bstr_t
загрязнен, существующий внутренний указатель m_wstr
будет перезаписан, что приведет к утечке предыдущей памяти, на которую он ссылался.
Используя следующее operator&
, можно использовать грязный _bstr_t
, учитывая, что он сначала очищается с помощью Assign(nullptr)
.Перегрузка также обеспечивает удобство использования оператора адреса вместо GetBSTR()
;
BSTR *operator&(_bstr_t &b) {
b.Assign(nullptr);
return &b.GetBSTR();
}
Итак, ваш первый пример может выглядеть следующим образом:
_bstr_t description(L"naughty");
errorInfo->GetDescription(&description);
Эта оценка былана основе comutil.h
от VS 12.0.