2009-11-16 51 views
7

我讀過下面的代碼導致內存泄漏。但不明白爲什麼。CComBSTR的內存泄漏

CComBSTR str; 
pFoo->get_Bar(&str); 
pFoo->get_Baf(&str); 

當我們沒有分配任何東西時它是如何導致泄漏的?

回答

11

它泄漏,因爲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 - 內存泄漏。

+0

所以如果我們只有前兩行 CComBSTR str; pFoo-> get_Bar(&str); 然後它不會導致泄漏,並且沒有必要清空它的權利 – Julian 2009-11-16 23:59:05

+0

這是正確的 – Aaron 2009-11-17 04:50:46

+0

我曾經在CComBSTR中提出泄漏警告,但我不確定它是否仍然存在在這臺機器上沒有Visual Studio),如果你嘗試在初始化的CComBSTR上使用operator&,應該有一個斷言,你可能需要定義一些符號來啓用它 - 參見CComBSTR的源代碼。 – 2009-11-17 06:11:57

4

此Microsoft網頁可能是,你瞭解它:

http://msdn.microsoft.com/en-us/library/bdyd6xz6.aspx

內存泄漏問題

傳遞一個初始化的CComBSTR的地址給一個函數作爲一個[out]參數導致內存泄漏。

CComBSTR對象在內部分配內存。顯然有些情況下它不會釋放它。