假设我们有一个指向 com 接口的指针,所以我的问题是我们是否需要在 Release() 调用之后将指针设置为 null。或者COM如何处理它?
Func1()
{
.....
.....
pComInterface->Release();
pComInterface = NULL; //---> Does this required? If used, then what is the impact?
}
我假设pComInterface
是一个原始指针,声明为例如:
IFoo* pComInterface
不,你不需要 NULL 它 - 它只是你的局部变量。然而,调用 ofIUnknown::Release
是强制性的,因为您通知对象您释放了指针,并且对象可以安全地减少其内部引用计数器(如果有的话)。
如果pComInterface
是指向某个 COM 接口的原始指针,那么从 COM 的角度来看,重要的是调用Release()
以正确管理对象的生命周期。NULL
(COM 不知道在调用. 之后是否将原始指针设置为Release()
。)
但是,从良好代码质量的角度来看,您应该在调用后将指针设置为NULL
(或者,nullptr
在 C++11 中更好)Release()
,以确保您没有对先前发布的 COM 对象的悬空引用,如果您有以下代码Release()
。
(这与new
and类似delete
:您必须调用delete
afternew
才能正确释放对象的资源;您不需要“需要”将指针设置为nullptr
after delete
,但避免悬挂对已删除对象的引用是一种很好的编码实践。)
此外,更好的是使用智能指针来管理 COM 对象接口的生命周期,例如ATL::CComPtr
. 这样,会自动为您正确调用Release()
(and AddRef()
) 。(继续与and进行比较,这与更喜欢智能指针(如or而不是原始拥有指针)的建议相同。)new
delete
shared_ptr
unique_ptr