2010-08-04 28 views
3

我相信下面以_bstr_t導致內存訪問衝突錯誤爲false參數(FCOPY)導致的內存被釋放了的CComBSTR:轉換的CComBSTR與FCOPY假

CComBSTR myCComBSTR; 
string strMyCComBSTR = string(_bstr_t(myCComBSTR, false)); 

不過,我不明白爲什麼這是爲MSDN文檔說以下有關FCOPY:

如果爲false,BSTR參數是附加到新的對象 沒有 通過調用 SysAllocString製作副本。

我的問題是:

  1. 我是說得很對,這是一個問題
  2. 如果是這樣 - 爲什麼?

感謝

回答

2

是的,這是一個問題 - 無論myCComBSTR和臨時會嘗試釋放字符串,因爲他們都將認爲他們擁有它。

你看,fcopyfalse的意思是「請不要複製字符串主體,只需附加到我給你的身體」。當第一行完成時,您擁有字符串緩衝區myCComBSTR,並且在創建第二行上的臨時對象時,由於fcopyfalse,所以它也獲得了同一字符串緩衝區的所有權。然後臨時被銷燬並釋放字符串緩衝區。後來myCComBSTR將被銷燬,並會嘗試再次釋放相同的字符串緩衝區 - 您會遇到所謂的雙免費,這會導致未定義的行爲。

+0

+1如果我們使用BSTR而不是CComBSTR,這也會成爲問題嗎?我假設不是因爲BSTR是一個原始的ptr,所以如果它超出了範圍,它不會釋放內存? – 2010-08-04 10:38:13

+1

@David Relihan:你是說像這樣的(BSTR)什麼東西投給BSTR?這將取決於。在你的情況下,只要不改變fcopy就可以了。 – sharptooth 2010-08-04 11:23:26

+1

@David你也可以這樣做:'string strMyCComBSTR = string(_bstr_t(myCComBSTR.Detach(),false));'如果你以後不打算使用'myCComBSTR' – 2012-09-20 17:57:28