在下面的片段(循环的简化场景)
_bstr_t original(OLESTR("MyString")); // ref-count = 1
_bstr_t another;
another = original; // ref-count = 2
// do something with another
another.Assign(NULL); // expected: ref-count = 1, and another = NULL
// reset another to NULL before doing other operations
another.Assign(NULL)
后我的期望是:
SysFreeString()
未被称为another
设置为NULL
original
的{{1}}内容为ref count=1
。发生了什么:
BSTR
被称为SysFreeString()
和BSTR
的基础another
original
设置为another
NULL
的重新计数仍为2 original
似乎已为another.Assign(NULL)
和BSTR
解除分配基础original
。
我们遇到了意想不到的崩溃,因为在编码过程中,我认为another
会减少引用计数,而不是立即取消分配_bstr_t::Assign()
。
如何在不影响BSTR
的情况下将another
正确重置为NULL
?
请从original
找到Assign
的实施方式。
VC++ 6
答案 0 :(得分:0)
_bstr_t::Assign()
的实施已按照Igor Tandetnik comment中的{{3}}所述进行了更新。
这是VS2010中的实现,它按预期工作:
inline void _bstr_t::Assign(BSTR s)
{
_COM_ASSERT(s == NULL || m_Data == NULL || m_Data->GetWString() != s);
if (s == NULL || m_Data == NULL || m_Data->GetWString() != s)
{
_Free();
m_Data = new Data_t(s, TRUE);
if (m_Data == NULL) {
_com_issue_error(E_OUTOFMEMORY);
}
}
}