2

ATL::CComVariant少数赋值运算符。我在实现中看到的是赋值运算符接受LPCOLESTRIUnknown*或者IDispatch*第一个动作是调用Clear()

如果以这样一种方式调用运算符,即传递同一对象的成员变量

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

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

我是正确的还是我误解了什么?

4

2 回答 2

0

这是一个错误。

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

于 2016-10-28T11:52:13.497 回答
0
 variant = variant.bstrVal;

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

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

于 2016-10-28T14:04:37.400 回答