【问题标题】:Difference between ".Release()" and "->Release()" for CComPtr?CComPtr 的“.Release()”和“->Release()”之间的区别?
【发布时间】:2015-11-03 10:29:36
【问题描述】:

有人能解释清楚有什么区别吗 .Release()->Release() 在 CComPtr 上?

确切地说,在这两种情况下内存管理是如何发生的?

【问题讨论】:

  • @tartanllama 太糟糕了,在重复的线索中投票率最高的答案如此不精确。
  • 我不认为这是一个合适的重复,在这种情况下它们都是重载的运算符
  • 哇,这些答案中的大多数完全忽略了运算符重载。
  • 只需使用调试器进入CComPtr::Release,您就会立即看到在托管指针上进一步调用IUnknown::Release之间的几行代码。
  • ->Release() 几乎可以肯定是一个错误,.Release() 是你不应该做的事情,因为使用 CComPtr 的目的是让它自动处理它。请改用delete 运算符,它是明确的。

标签: c++ com atl


【解决方案1】:

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

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

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

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

根据this page,最近版本的ATL实际上有operator->返回一个隐藏AddRefRelease的代理类,所以如果你尝试->Release(),你应该得到一个编译错误,而不是得到一个双重删除。

【讨论】:

    猜你喜欢
    • 2012-09-29
    • 1970-01-01
    • 2011-06-13
    • 1970-01-01
    • 1970-01-01
    • 2018-09-09
    • 1970-01-01
    • 1970-01-01
    • 2010-10-18
    相关资源
    最近更新 更多