我讀過下面的代碼導致內存泄漏。但不明白爲什麼。CComBSTR的內存泄漏
CComBSTR str;
pFoo->get_Bar(&str);
pFoo->get_Baf(&str);
當我們沒有分配任何東西時它是如何導致泄漏的?
我讀過下面的代碼導致內存泄漏。但不明白爲什麼。CComBSTR的內存泄漏
CComBSTR str;
pFoo->get_Bar(&str);
pFoo->get_Baf(&str);
當我們沒有分配任何東西時它是如何導致泄漏的?
它泄漏,因爲get_Bar()
和get_Baf()
不知道您正在使用CComBSTR。
當你獲取CComBSTR的地址時,你實際傳遞給底層對象的是一個指向CComBSTR的BSTR成員的指針。
打破序列:
CComBSTR str;
此初始化內部BSTR爲NULL。
pFoo->get_Bar(&str);
get_Bar()
看到一個BSTR *並填充實際數據。像這樣:
HRESULT get_Bar(BSTR* arg) { *arg = SysAllocString(L"My String"); }
現在str
的內部BSTR是一個真正的BSTR。當CComBSTR超出範圍時,它將刪除str
成員。
現在,如果您致電get_Baf()
& str問題是CComBSTR不知道您正在更改字符串。所以,你叫get_Baf()
這樣的:
HRESULT get_Baf(BSTR* arg) { *arg = SysAllocString(L"My String"); }
現在get_Baf()
已覆蓋str
的內部BSTR的原始值,沒有任何人釋放,是由get_Bar()
分配的數據。
Ta da - 內存泄漏。
此Microsoft網頁可能是,你瞭解它:
http://msdn.microsoft.com/en-us/library/bdyd6xz6.aspx
內存泄漏問題
傳遞一個初始化的CComBSTR的地址給一個函數作爲一個[out]參數導致內存泄漏。
CComBSTR對象在內部分配內存。顯然有些情況下它不會釋放它。
所以如果我們只有前兩行 CComBSTR str; pFoo-> get_Bar(&str); 然後它不會導致泄漏,並且沒有必要清空它的權利 – Julian 2009-11-16 23:59:05
這是正確的 – Aaron 2009-11-17 04:50:46
我曾經在CComBSTR中提出泄漏警告,但我不確定它是否仍然存在在這臺機器上沒有Visual Studio),如果你嘗試在初始化的CComBSTR上使用operator&,應該有一個斷言,你可能需要定義一些符號來啓用它 - 參見CComBSTR的源代碼。 – 2009-11-17 06:11:57