リーク チェッカーは、次のコードで割り当てられているメモリにメモリ リークがあることを示しています。
// Get the value from the object as a variant.
VARIANT vVal;
VariantInit ( &vVal );
hres = clsObj->Get ( fieldName.c_str(), 0, &vVal, 0, 0 );
if ( FAILED ( hres ) )
{
(... various cleanup / throw stuff ...)
}
// And get it as a wstring.
wstring val ( vVal.bstrVal );
(... do some standard, non-memory leaking stuff with the wstring ...)
// Clean up.
VariantClear ( &vVal );
そこにある「clsObj」は、WMI 用の Microsoft インターフェイスである IWbemClassObject です。
リークしたメモリを割り当てる特定の行は、「clsObj->Get」行です。次に、リーク チェッカーは、ソース コードを持っていないリーク自体のより具体的なコードを報告します (つまり、リークしたメモリの割り当て時のスタック トレース内)。
(ole32): (filename not available): CoRevokeMallocSpy
(OLEAUT32): (filename not available): GetErrorInfo
(OLEAUT32): (filename not available): SysAllocStringLen
(OLEAUT32): (filename not available): SysAllocString
(wbemcomn): (filename not available): CVar::SetBSTR
(wbemcomn): (filename not available): CVar::FillVariant
(fastprox): (filename not available): CWbemObject::Get
そのため、VARIANT vVal の基になる BSTR がリークされているようです。しかし、私は VariantClear を行っています...他に何かする必要がありますか?
おそらく、wstringコンストラクターでリークしていますか?でも、もしそうなら、私にはわかりません。私は、bstrVal は基本的に char ポインター (または wchar など) に要約されると考えました。wstring コンストラクターは、他のポインターであるかのように、そのアドレスからコピーする必要がありますよね?
wstring コンストラクターが vVal.bstrVal によって最初に指されたメモリをクリアする責任を引き継ぐようなものではありません。参照カウントされた COM オブジェクトに対して Detach() を実行しているかのようです。
重要な場合、これは Visual C++ 6 にあります。