重新分配 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,内存泄漏?的主要内容,如果未能解决你的问题,请参考以下文章