在调用COM Release()函数后,指针是否被设置为空?

Should the pointer be set to null after calling COM Release() function?

本文关键字:是否 指针 设置 COM 调用 Release 函数      更新时间:2023-10-16

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

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

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

IFoo* pComInterface

不,你不需要把它设为NULL——它只是你的局部变量。然而,IUnknown::Release的调用是强制性的,因为你通知对象你释放了指针,并且对象可以安全地递减它的内部引用计数器,如果它有的话。

如果pComInterface是指向某个COM接口的原始指针,那么从COM的角度来看,重要的事情是调用Release()来适当地管理对象生命周期。(COM不知道在调用Release()后是否将原始指针设置为NULL)

然而,从良好的代码质量的角度来看,在调用Release()之后,您应该将指针设置为NULL(或者在c++ 11中更好的是nullptr),以确保您没有对先前发布的COM对象的悬空引用,如果您有一些代码遵循Release()

(这与newdelete类似:必须在new之后调用delete才能正确释放对象的资源;您不"需要"在delete之后将指针设置为nullptr,但这是一个很好的编码实践,可以避免对已删除对象的悬空引用。

此外,更好的方法是使用智能指针来管理COM对象接口的生命周期,如 ATL::CComPtr 。这样,对Release()(和AddRef())的适当调用将自动为您。(继续与newdelete进行比较,这与首选智能指针shared_ptrunique_ptr而不是原始拥有指针的建议相同。)