【发布时间】:2011-03-10 13:15:45
【问题描述】:
ATL::CComVariant 有 a handful of assignment operators。我在实现中看到的是,在接受LPCOLESTR、IUnknown* 或IDispatch* 的赋值运算符中,第一个操作是调用Clear()。
如果调用运算符时传递了同一对象的成员变量
CComVariant variant;
variant = L"string";
variant = variant.bstrVal;
(具有相同效果的笨方法较少)Clear() 将释放封装的对象,并且对现在悬空指针的所有后续操作将导致未定义的行为。
我是对的还是我误解了什么?
【问题讨论】:
-
看起来像一个错误。在参数“混叠”的情况下,必须更加小心地处理这些问题。首先是本地副本 (
AddRef/SysAllocString),然后是Clear,然后转移所有权。 -
@wqw:你在说什么别名?仅仅比较 store 指针和要赋值的指针是不是不够?
标签: visual-c++ com pointers atl undefined-behavior