2010-08-24 3 views
7

Скажем, у меня есть следующие:Понимание операторов присваивания CComBSTR

BSTR myBSTR = SysAllocString(L"MYBSTR"); 
CComBSTR myCComBSTR = myBSTR; 

ли myCComBSTR взять на себя ответственность myBSTR и освободить его, когда он выходит из области видимости? Или он делает копию myBSTR и создает утечку памяти, если я не освобожу myBSTR?

Если это вызывает утечку памяти, что является наиболее эффективным способом ее устранения? (myBSTR будет принят в к функции как BSTR и я хочу, чтобы сохранить его как CComBSTR внутренне)

ответ

11

В этом случае экземпляр CComBSTR создает независимую копию. Чтобы избежать утечки, вам необходимо вручную освободить myBSTR.

Самый простой подход, чтобы исправить эту ситуацию, чтобы пропустить среднего человека SysAllocString функцию

CComBSTR myCComBSTR = L"MYBSTR"; 

С другой стороны, если у вас есть BSTR и хотите иметь судовладелец CComBSTR тейк его затем использовать присоединять метод , Этот метод передает право собственности на ресурс из источника BSTR на экземпляр CComBSTR.

CComBSTR myCComBSTR; 
myCComBSTR.Attach(myBSTR); 
+1

В чем разница между CComBSTR :: Attach и CComBSTR :: AssignBSTR? –

+0

@ mvdavid7, AssignBSTR не передает права собственности и просто делает копию. Прикрепите права на передачу на 'CComBSTR' и не делайте копии. – JaredPar

Смежные вопросы