CComPtr的“.Release()”和“ - > Release()”之间的区别?

时间:2015-08-11 09:12:56

标签: c++ com atl

有人可以清楚地解释一下它们之间的区别 .Release() 和 CComPtr上的->Release()

准确地说,在任何一种情况下都会发生内存管理?

1 个答案:

答案 0 :(得分:5)

operator->的{​​{1}}函数产生一个指向被管理对象的原始接口指针。 (但见下文)

因此,调用CComPtr将释放对象(即减少其内部引用计数)。

->Release()函数将调用.Release()使智能指针停止管理原始接口指针。

后者通常是你想要做的。如果你调用->Release(),那么智能指针不知道这一点,当智能指针的析构函数运行时,它会再次调用->Release(),这是坏的(双重释放)。

根据this page,最近版本的ATL实际上有->Release()返回隐藏operator->AddRef的代理类,因此如果您尝试,则会出现编译错误Release,而不是双重删除。