【问题标题】:Initializing a BSTR to another BSTR using assignment operator使用赋值运算符将 BSTR 初始化为另一个 BSTR
【发布时间】:2016-11-02 12:11:54
【问题描述】:

我有一个类似的代码-

void CSomeClass::Remove()
{
  BSTR tempStr = NULL;

  while(!m_list.IsEmpty()) //m_list is a CSomeClass member of type CList<BSTR, BSTR>
  {
    tempStr = m_list.RemoveHead(); //application crash here!!

    if(NULL==tempStr)
       continue;
  }

  SysFreeString(tempStr);

}

我不确定应用程序为什么会崩溃。 是否可以使用赋值运算符将 BSTR 初始化为另一个 BSTR? 谁能帮我找出应用程序崩溃的原因?

【问题讨论】:

  • BSTR 只是wchar_t* 的类型定义。是的,当然您可以将指针分配给变量。您的问题出在其他地方 - 很可能是堆损坏(某处,可能在一段完全不相关的代码中;堆损坏在这种情况下令人讨厌)。

标签: com atl bstr clist


【解决方案1】:

是的。 BSTR 可以分配给另一个 BSTR 变量。 BSTR其实是实际数据的起始地址。

这里的问题在于 RemoveHead() 函数而不是赋值。 请查看完整的堆栈跟踪或仅将调试器附加到您的程序以进一步调试问题。

【讨论】:

    【解决方案2】:

    将 SysFreeString 放入循环中

    void CSomeClass::Remove()
    {
      BSTR tempStr = NULL;
    
      while(!m_list.IsEmpty()) //m_list is a CSomeClass member of type CList<BSTR, BSTR>
      {
        tempStr = m_list.RemoveHead(); //application crash here!!
    
        if(NULL==tempStr)
           continue;
        SysFreeString(tempStr);
      }
    
    
    }
    

    【讨论】:

      猜你喜欢
      • 2014-11-20
      • 1970-01-01
      • 2012-03-11
      • 2011-04-08
      • 2010-09-15
      • 2013-05-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多