假设我们有一个指向 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()。
(这与newand类似delete:您必须调用deleteafternew才能正确释放对象的资源;您不需要“需要”将指针设置为nullptrafter delete,但避免悬挂对已删除对象的引用是一种很好的编码实践。)
此外,更好的是使用智能指针来管理 COM 对象接口的生命周期,例如ATL::CComPtr. 这样,会自动为您正确调用Release()(and AddRef()) 。(继续与and进行比较,这与更喜欢智能指针(如or而不是原始拥有指针)的建议相同。)newdeleteshared_ptrunique_ptr