7

次のコードでメモリ リークが発生することを確認しました。しかし、理由がわかりませんでした。

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

何も割り当てていないときに、どのようにリークが発生するのでしょうか?

4

2 に答える 2

11

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()元の値を上書きしました。strget_Bar()

タダ-メモリリーク。

于 2009-11-16T23:53:06.497 に答える
4

このマイクロソフトのページは、おそらくあなたがそれについて読んだ場所です:

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

メモリ リークの問題

初期化された CComBSTR のアドレスを [out] パラメータとして関数に渡すと、メモリ リークが発生します。

CComBSTR オブジェクトは内部的にメモリを割り当てています。明らかにそれを解放しないケースがあります。

于 2009-11-16T23:28:44.890 に答える