重新分配 CComBSTR,内存泄漏?

Posted

技术标签:

【中文标题】重新分配 CComBSTR,内存泄漏?【英文标题】:Reassigning CComBSTR, memory leak? 【发布时间】:2021-09-21 13:52:59 【问题描述】:

正如MSDN documentation CComBSTR::operator= 中所写,它创建了一个 src 的副本。 所以当我写

someCComBSTR = std::to_wstring(someVal).c_str();

我会有一份临时的,一切都好。但是我还没有发现之前的值会发生什么,它会被释放还是重写,或者我应该先手动清空我的 CComBSTR 对象?

【问题讨论】:

不确定您所说的“临时”是什么意思。您正在使用的= 运算符版本将LPCSTR 作为其参数,并将其副本分配给目标BSTR 对象的m_str 成员。据推测,当someCComBSTR 被销毁时,它将被释放。 如果类没有被破坏,你可以假设它正确地管理了它的资源。您是否观察到一些内存泄漏?相关类型:***.com/questions/4172722/what-is-the-rule-of-three @463 Visual Studio 带有几个BSTR 包装器(CComBSTR_bstr_t 等)。它们在资源管理方面的行为都略有不同。做出假设是糟糕的建议。 【参考方案1】:

CComBSTR 在 Visual Studio 的 atlmfc/include 目录的头文件 atlcomcli.h 中定义。所有赋值运算符 (operator=) 通过调用 SysFreeString 释放当前拥有的数据(这里有一些不感兴趣的例外情况)。

问题中发布的代码行不会泄漏任何资源。它正在为CComBSTR 调用以下赋值运算符(为清楚起见添加了cmets):

CComBSTR& operator=(_In_opt_z_ LPCOLESTR pSrc)

    // Prevent self-assignment
    if (pSrc != m_str)
    
        // Free currently owned resources
        ::SysFreeString(m_str);
        if (pSrc != NULL)
        
            // Create copy of pSrc and take ownership
            m_str = ::SysAllocString(pSrc);
            // Error handling
            if (!*this)
            
                AtlThrow(E_OUTOFMEMORY);
            
        
        else
        
            // Clear instance data if pSrc is a null pointer
            m_str = NULL;
        
    
    return *this;

【讨论】:

以上是关于重新分配 CComBSTR,内存泄漏?的主要内容,如果未能解决你的问题,请参考以下文章

前端如何处理内存泄漏

没有分配任何内存的内存泄漏

动态分配泄漏内存?

常见的内存泄漏原因及解决方法

Android内存泄漏

重新仪器“内存泄漏”分析,其他工具是不是提供更多信息以找到泄漏的根本原因?