假设我们有一个指向com接口的指针,所以我的问题是我们需要在调用Release()之后将指针设置为null。或者COM如何处理它?</ p>
Func1()
{
.....
.....
pComInterface->Release();
pComInterface = NULL; //---> Does this required? If used, then what is the impact?
}
答案 0 :(得分:6)
我假设pComInterface
是一个原始指针,声明为例如:
IFoo* pComInterface
不,你不需要对它进行NULL - 它只是你的局部变量。但是,IUnknown::Release
的调用是强制性的,因为您通知对象释放指针,并且对象可以安全地减少其内部引用计数器(如果有)。
答案 1 :(得分:3)
如果pComInterface
是指向某个COM接口的 raw 指针,那么从COM的角度来看,重要的是调用Release()
来正确管理物体寿命。 (在调用NULL
后,COM不知道您是否将原始指针设置为Release()
。)
但是,从良好代码质量的角度来看,您应该在调用后将指针设置为NULL
(或者在C ++ 11中更好nullptr
) Release()
,如果您在Release()
后面有一些代码,请确保您没有对先前发布的COM对象的悬空引用。
(它与new
和delete
类似:您必须在delete
之后致电new
以正确释放对象的资源;您不要#39; t&#34;需要&#34;在nullptr
之后将指针设置为delete
,但它是一种很好的编码习惯,可以避免悬挂对已删除对象的引用。)
此外,更好的方法是使用智能指针来管理COM对象接口的生命周期,例如 ATL::CComPtr
。这样,Release()
(和AddRef()
)的正确调用就会自动 。
(继续与new
和delete
进行比较,与shared_ptr
或unique_ptr
之类的智能指针相同,而不是原始拥有指针。)