如何正确地将_bstr_t重置为“NULL”

时间:2013-07-23 07:59:27

标签: c++ com smart-pointers bstr

在下面的片段(循环的简化场景)

_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
  • ref-count递减为1
  • original的{​​{1}}内容为ref count=1

发生了什么:

    {li> 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

1 个答案:

答案 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);
        }
    }
}