次のコードでメモリ リークが発生することを確認しました。しかし、理由がわかりませんでした。
CComBSTR str;
pFoo->get_Bar(&str);
pFoo->get_Baf(&str);
何も割り当てていないときに、どのようにリークが発生するのでしょうか?
次のコードでメモリ リークが発生することを確認しました。しかし、理由がわかりませんでした。
CComBSTR str;
pFoo->get_Bar(&str);
pFoo->get_Baf(&str);
何も割り当てていないときに、どのようにリークが発生するのでしょうか?
CComBSTRを使用していることを知らないためget_Bar()
、リークします。get_Baf()
CComBSTRのアドレスを取得すると、基になるオブジェクトに実際に渡されるのは、CComBSTRのBSTRメンバーへのポインターです。
シーケンスの内訳:
CComBSTR str;
これにより、内部BSTRがNULLに初期化されます。
pFoo->get_Bar(&str);
get_Bar()
BSTR *を確認し、実際のデータで埋めます。このような:
HRESULT get_Bar(BSTR* arg) { *arg = SysAllocString(L"My String"); }
これで、の内部BSTRstr
は実際のBSTRになります。CComBSTRがスコープ外になると、str
メンバーが削除されます。
ここget_Baf()
で&strを呼び出すと、問題は、CComBSTRが文字列を変更していることを認識しないことです。だからあなたはget_Baf()
このように呼びます:
HRESULT get_Baf(BSTR* arg) { *arg = SysAllocString(L"My String"); }
によって割り当てられたデータを誰も解放せずに、の内部BSTRのget_Baf()
元の値を上書きしました。str
get_Bar()
タダ-メモリリーク。
このマイクロソフトのページは、おそらくあなたがそれについて読んだ場所です:
http://msdn.microsoft.com/en-us/library/bdyd6xz6.aspx
メモリ リークの問題
初期化された CComBSTR のアドレスを [out] パラメータとして関数に渡すと、メモリ リークが発生します。
CComBSTR オブジェクトは内部的にメモリを割り当てています。明らかにそれを解放しないケースがあります。