使用fcopy将CComBSTR转换为_bstr_t为false

时间:2010-08-04 10:16:56

标签: com

我认为以下原因导致内存访问冲突错误,因为false参数(fcopy)导致为CComBSTR释放内存:

CComBSTR myCComBSTR;
string strMyCComBSTR = string(_bstr_t(myCComBSTR, false));

但是,我不太确定为什么这是因为MSDN文档中有关于fcopy的以下内容:

  

如果为false,则bstr参数为   附加到新对象没有   通过电话复制   SysAllocString。

我的问题是:

  1. 我是否正确地说这是一个问题
  2. 如果是这样 - 为什么?
  3. 由于

1 个答案:

答案 0 :(得分:2)

是的,这是一个问题 - myCComBSTR和临时版都会尝试释放字符串,因为他们都认为他们拥有它。

你看,fcopy的价值为false意味着“请不要复制字体,只要贴在我给你的身上”。当第一行完成时,您拥有myCComBSTR拥有字符串缓冲区,并且当创建第二行上的临时对象时,由于fcopyfalse,它还拥有相同字符串缓冲区的所有权。然后临时被销毁并释放字符串缓冲区。稍后myCComBSTR将被销毁,并将尝试再次释放相同的字符串缓冲区 - 您遇到所谓的 double free ,这会导致未定义的行为。