有人可以清楚地解释一下它们之间的区别
.Release()
和
CComPtr上的->Release()
?
准确地说,在任何一种情况下都会发生内存管理?
答案 0 :(得分:5)
operator->
的{{1}}函数产生一个指向被管理对象的原始接口指针。 (但见下文)
因此,调用CComPtr
将释放对象(即减少其内部引用计数)。
->Release()
函数将调用.Release()
,和使智能指针停止管理原始接口指针。
后者通常是你想要做的。如果你调用->Release()
,那么智能指针不知道这一点,当智能指针的析构函数运行时,它会再次调用->Release()
,这是坏的(双重释放)。
根据this page,最近版本的ATL实际上有->Release()
返回隐藏operator->
和AddRef
的代理类,因此如果您尝试,则会出现编译错误Release
,而不是双重删除。