Вы должны позаботиться обо всех BSTR
с, кроме того, которое вы фактически передаете в качестве параметра "out".BSTR
, которые вы раздаете, не нужно освобождать - вызывающий становится ответственным за его освобождение, а ваш код отвечает за все другие BSTR
s, которые он мог бы выделить.
Если вам действительно нужны эти временные BSTR
s, вы должны использовать класс-оболочку, например ATL::CComBSTR
или _bstr_t
, для этих временных BSTR
s (но не для того, который вы выдавали).Я предполагаю, что в случае, если вы опишете, вам будет гораздо лучше просто переписать свой код таким образом, что вам не нужно больше, чем одно BSTR
создание на любом пути управления.
Вот некоторый псевдокод:1013 *
HRESULT YourFunction( BSTR* result )
{
if( result == 0 ) {
return E_POINTER;
}
int internalStateValue = getState();
if( internalStateValue > 0 ) { // first case
*result = SysAllocString( "positive" );
} else if( internalStateValue < 0 ) { //second case
*result = SysAllocString( "negative" );
} else { //default case
*result = SysAllocString( "zero" );
}
return S_OK;
}