我正在运行 Deleaker 应用程序来查找和修复应用程序中的内存泄漏。 现在,它在 Microsoft CRestrictions 类(atldbsch.h 文件)的 Open() 函数中发现了很多 BSTR 泄漏。
如果看那里,就会注意到它需要 7 个 LPCTSTR 参数,然后像这样使用它们:
pVariant = m_pvarRestrictions + 1;
.
.
pVariant->bstrVal = ::SysAllocString(T2COLE_EX_DEF(lpszParam1));
这对所有七个这样的参数都完成了(每次增加数字 1)。
析构函数只是在做
delete[] m_pvarRestrictions;
但通过调用::SysFreeStr() 永远不会释放通过::SysAllocString() 分配的 BSTR
我是不是遗漏了什么或者有泄漏,在这种情况下应该如何处理?
最佳答案
检查代码后,我会说这里没有泄漏,因为 m_pvarRestrictions 是指向 CComVariant 数组的指针,并且该数组是通过 delete[] 删除的,因此调用了每个 CComVariant 的析构函数。 CComVariant::~CComVariant() 调用 VariantClear,如果此 VARIANT 包含它,它本身会释放 BSTR。
然后我检查了 Deleaker(版本 3.0.66.0)如何与 CComVariant 一起工作,这里是我的代码:
int _tmain(int argc, _TCHAR* argv[])
{
CComVariant* v = new CComVariant(L"123");
delete v;
return 0;
}
没有显示泄漏。可能您已经尝试过旧版本的 Deleaker。
如果我删除 delete v,则会看到两个泄漏:堆内存和 BSTR。
关于c++ - atldbsch.h 中的 BSTR 内存泄漏 - 怎么办?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31070729/