【问题标题】:Converting CComBSTR to _bstr_t with fcopy as false在 fcopy 为 false 的情况下将 CComBSTR 转换为 _bstr_t
【发布时间】:2011-03-25 04:32:47
【问题描述】:

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

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

但是,我不太确定为什么这是 MSDN 文档中关于 fcopy 的说明:

如果为 false,则 bstr 参数为 附加到新对象而不 通过调用制作副本 SysAllocString。

我的问题是:

  1. 我说这是一个问题对吗
  2. 如果是这样 - 为什么?

谢谢

【问题讨论】:

    标签: com


    【解决方案1】:

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

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

    【讨论】:

    • +1 如果我们使用 BSTR 而不是 CComBSTR,这也会成为问题吗?我认为不是因为 BSTR 是原始 ptr,所以如果超出范围就不会释放内存?
    • @David Relihan:你的意思是像 (BSTR)something 这样投到 BSTR 吗?那将取决于。在您的情况下,不更改 fcopy 并让它成为真的会更简单。
    • @David 如果您以后不打算使用myCComBSTR,您也可以这样做:string strMyCComBSTR = string(_bstr_t(myCComBSTR.Detach(), false));
    猜你喜欢
    • 1970-01-01
    • 2011-01-18
    • 2023-04-01
    • 2012-01-28
    • 1970-01-01
    • 1970-01-01
    • 2012-06-21
    • 2012-08-09
    • 2017-05-27
    相关资源
    最近更新 更多