泄漏检查器告诉我,在以下代码中分配的内存存在内存泄漏:
// 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”是一个IWbemClassObject,它是一个微软的WMI 接口。
分配泄漏内存的特定行是“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 中。