2017/06/22

[Memory leak] BSTR 轉 CString

要將 BSTR 轉為 CString 下列寫法,Compiler並不會報錯 程式也能正確運行
BSTR bstrText = xxx ; CString str = _com_util::ConvertBSTRToString(bstrText);
但是,程式結束時,會出現 Memory leak 若是不斷運行該段代碼 Memory將會逐漸減少 原因是: _com_util::ConvertBSTRToString() function 的返回值,其實是 char* 而 CString 會幫 char* 做轉換,自動存入自己變數中 這樣處理,造成了 _com_util::ConvertBSTRToString() 跟系統要到的記憶體,沒有人可以幫忙去釋放 因此 每一次調用該function, Memory就被要走 減少一部分 比較正確的做法 應該要這樣寫:
BSTR bstrText = xxx ; char *p = _com_util::ConvertBSTRToString(bstrText); CString str = p; delete p;
這樣 這塊 memory 有人去 delete他,就不會造成 memory leak了