【问题标题】:Is this a self-assignment bug in ATL::CComVariant?这是 ATL::CComVariant 中的自分配错误吗?
【发布时间】:2011-03-10 13:15:45
【问题描述】:

ATL::CComVarianta handful of assignment operators。我在实现中看到的是,在接受LPCOLESTRIUnknown*IDispatch* 的赋值运算符中,第一个操作是调用Clear()

如果调用运算符时传递了同一对象的成员变量

 CComVariant variant;
 variant = L"string";
 variant = variant.bstrVal;

(具有相同效果的笨方法较少)Clear() 将释放封装的对象,并且对现在悬空指针的所有后续操作将导致未定义的行为。

我是对的还是我误解了什么?

【问题讨论】:

  • 看起来像一个错误。在参数“混叠”的情况下,必须更加小心地处理这些问题。首先是本地副本 (AddRef/SysAllocString),然后是 Clear,然后转移所有权。
  • @wqw:你在说什么别名?仅仅比较 store 指针和要赋值的指针是不是不够?

标签: visual-c++ com pointers atl undefined-behavior


【解决方案1】:
 variant = variant.bstrVal;

由于CComVariant 实例管理字符串指针,这种赋值的预期逻辑是类实例复制字符串并初始化内部成员(类型和字符串指针)。当前拥有的价值/资源被处置。

如果我们将拥有的指针作为参数传递,我们感兴趣的是确保在释放成员值之前该值是重复的。或者,该方法正确地检测到“相同指针”的情况并忽略分配。从 Visual Studio 2015 Update 3 开始,ATL 正是这样做的:它检测到相同的指针分配并立即返回跳过分配/释放部分。也就是说,ATL 实现是准确的,并且处理得很好。

【讨论】:

    【解决方案2】:

    这是一个错误。

    不幸的是,ATL 仍然有很多这样的东西 - 比我在任何其他具有类似影响力的库中处理的都要多。

    【讨论】:

      猜你喜欢
      • 2011-12-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-05-04
      • 2011-09-28
      • 2017-07-23
      • 2012-09-15
      相关资源
      最近更新 更多