重新分配 CComBSTR,内存泄漏?
Reassigning CComBSTR, memory leak?
如 MSDN documentation 中所写,CComBSTR::operator= 创建 src 的副本。
所以当我写
someCComBSTR = std::to_wstring(someVal).c_str();
我会有一份临时的,一切正常。但是我还没有发现以前的值会发生什么,它会被释放还是重写,或者我应该先手动清空我的 CComBSTR 对象?
CComBSTR
定义在 atlcomcli.h 中 Visual Studio 的 atlmfc/include 目录。所有赋值运算符 (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;
}
如 MSDN documentation 中所写,CComBSTR::operator= 创建 src 的副本。 所以当我写
someCComBSTR = std::to_wstring(someVal).c_str();
我会有一份临时的,一切正常。但是我还没有发现以前的值会发生什么,它会被释放还是重写,或者我应该先手动清空我的 CComBSTR 对象?
CComBSTR
定义在 atlcomcli.h 中 Visual Studio 的 atlmfc/include 目录。所有赋值运算符 (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;
}