c++ - atldbsch.h 中的 BSTR 内存泄漏 - 怎么办?

标签 c++ memory-leaks

我正在运行 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/

相关文章:

c++ - 如果使用 remove_if 并且项目是指向对象的指针,如何删除 vector 中的项目?

c - 释放非堆内存

c++ - 模板静态成员初始化顺序

jquery - 当 Angular 开始销毁时,我们是否需要取消绑定(bind)指令中的事件监听器?

c++ - 在 C++ 类型转换期间自动舍入 a

c++ - OpenCL 不明确上下文构造函数

.net - 当前逻辑线程增加/线程堆栈泄漏

java - 如何使用 VisualVM 测量 Storm 拓扑中的内存泄漏?

c++ - 在 cython 中为 cpp 类使用访问器语法

c++ - 并发处理 std::stack 的正确方法