4

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

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

2 回答 2

7

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

IFoo* pComInterface

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

于 2013-03-12T07:09:29.760 回答
3

如果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

于 2013-03-12T11:17:37.907 回答