使用赋值运算符将 BSTR 初始化为另一个 BSTR

Posted

技术标签:

【中文标题】使用赋值运算符将 BSTR 初始化为另一个 BSTR【英文标题】:Initializing a BSTR to another BSTR using assignment operator 【发布时间】: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 只是wchar_t* 的类型定义。是的,当然您可以将指针分配给变量。您的问题出在其他地方 - 很可能是堆损坏(某处,可能在一段完全不相关的代码中;堆损坏在这种情况下令人讨厌)。 【参考方案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);
  



【讨论】:

以上是关于使用赋值运算符将 BSTR 初始化为另一个 BSTR的主要内容,如果未能解决你的问题,请参考以下文章

将数组的所有元素初始化为相同的数字

c语言 如何将已赋值的字符串初始化为空?

将 xib 视图初始化为另一个 NSView 的子视图

为啥memset不能将数组元素初始化为1

在 Javascript 中使用赋值运算符将一个对象设置为等于另一个对象

拷贝控制——拷贝赋值与销毁