问题描述
正如 MSDN documentation 中所写,CComBSTR::operator= 创建了 src 的副本。 所以当我写
someCComBSTR = std::to_wstring(someVal).c_str();
我会有一份临时文件,一切正常。但是我还没有发现之前的值会发生什么,它会被释放或重写,还是我应该先手动清空我的 CComBSTR 对象?
解决方法
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;
}