有人能清楚地解释一下.Release()和->Release()在CComPtr上的区别吗?
准确地说,在这两种情况下,内存管理是如何发生的?
发布于 2015-08-11 09:37:31
operator->函数的CComPtr产生一个原始接口指针的对象被管理。(但见下文)
因此,调用->Release()将释放对象(即减少其内部引用计数)。
.Release()函数将调用->Release(),并使智能指针停止管理原始接口指针。
后者通常是你想要做的。如果您调用->Release(),那么智能指针不知道这一点,并且当智能指针的析构函数运行时,它将再次调用->Release(),这是错误的(双版本)。
根据this page,最近版本的ATL实际上让operator->返回一个隐藏AddRef和Release的代理类,所以如果您尝试->Release(),就应该得到一个编译错误,而不是获得一个双重删除。
https://stackoverflow.com/questions/31937680
复制相似问题