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

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

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

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

【问题讨论】:

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

标签: c++ mfc com atl bstr


【解决方案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;
}

【讨论】:

    猜你喜欢
    • 2010-12-17
    • 1970-01-01
    • 2010-12-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-12
    • 2011-02-18
    • 1970-01-01
    相关资源
    最近更新 更多