_bstr_t b = GetSomeString();
Предположительно, это BSTR GetSomeString();
. Что для компилятора означает wchar_t* GetSomeString
; BSTR
говорит вам, что использует семантику COM, но компилятор этого не знает. И эта семантика, которую вы называете SysFreeString
.
_bstr_t::_bstr_t( wchar_t* str )
копий str
. Да, _bstr_t::~_bstr_t
вызовет SysFreeString
, но это будет сделано для копии. Вам нужно было позвонить SysFreeString
на BSTR GetSomeString();
.
Решение _bstr_t::_bstr_t( BSTR bstr , bool fCopy )
с fCopy=false
. За MSDN:
Этот конструктор используется функциями-обертками в библиотеке типов
заголовки для инкапсуляции и получения права собственности на BSTR, который возвращается
методом интерфейса.
Для VARIANT
см. _variant_t::_variant_t(VARIANT& varSrc, bool fCopy);
. Та же идея.