首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >.Release()和->Release()对于CComPtr的区别是什么?

.Release()和->Release()对于CComPtr的区别是什么?
EN

Stack Overflow用户
提问于 2015-08-11 09:12:55
回答 1查看 1K关注 0票数 0

有人能清楚地解释一下.Release()->Release()在CComPtr上的区别吗?

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

EN

回答 1

Stack Overflow用户

发布于 2015-08-11 09:37:31

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

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

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

后者通常是你想要做的。如果您调用->Release(),那么智能指针不知道这一点,并且当智能指针的析构函数运行时,它将再次调用->Release(),这是错误的(双版本)。

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

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31937680

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档