调用COM Release()函数后指针应该设置为null吗?

时间:2013-03-12 07:05:21

标签: c++ com interface

假设我们有一个指向com接口的指针,所以我的问题是我们需要在调用Release()之后将指针设置为null。或者COM如何处理它?<​​/ p>

Func1()
{
.....
.....
pComInterface->Release();
pComInterface = NULL;  //---> Does this required? If used, then what is the impact?
}

2 个答案:

答案 0 :(得分:6)

我假设pComInterface是一个原始指针,声明为例如:

IFoo* pComInterface

不,你不需要对它进行NULL - 它只是你的局部变量。但是,IUnknown::Release的调用是强制性的,因为您通知对象释放指针,并且对象可以安全地减少其内部引用计数器(如果有)。

答案 1 :(得分:3)

如果pComInterface是指向某个COM接口的 raw 指针,那么从COM的角度来看,重要的是调用Release()来正确管理物体寿命。 (在调用NULL后,COM不知道您是否将原始指针设置为Release()。)

但是,从良好代码质量的角度来看,您应该在调用后将指针设置为NULL(或者在C ++ 11中更好nullptrRelease(),如果您在Release()后面有一些代码,请确保您没有对先前发布的COM对象的悬空引用。

(它与newdelete类似:您必须在delete之后致电new以正确释放对象的资源;您不要#39; t&#34;需要&#34;在nullptr之后将指针设置为delete,但它是一种很好的编码习惯,可以避免悬挂对已删除对象的引用。)

此外,更好的方法是使用智能指针来管理COM对象接口的生命周期,例如 ATL::CComPtr 。这样,Release()(和AddRef())的正确调用就会自动 。 (继续与newdelete进行比较,与shared_ptrunique_ptr之类的智能指针相同,而不是原始拥有指针。)