重新分配 CComBSTR,内存泄漏?

时间:2021-07-12 11:33:22

标签: c++ mfc com atl bstr

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

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

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

1 个答案:

答案 0 :(得分:4)

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

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

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;
}