2010-08-24 92 views
7

說我有以下幾點:理解的CComBSTR賦值運算符

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

是否當它超出範圍的myBSTR和免費這myCComBSTR採取所有權?或者它是否製作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有什麼區別? – 2010-08-24 19:09:29

+0

@ mvdavid7,AssignBSTR不會轉讓所有權,只是進行復制。將所有權轉讓給'CComBSTR'並且不進行復制。 – JaredPar 2010-08-24 19:13:25