我正在研究的一些项目类似于
class ATLCOMCLASS<CComObjectRootEx<ATLCOMCLASS> >
{
ISomeInterfacePtr p;
/*some stuff*/
void FinalRelease()
{
p = NULL;
}
}
ISomeInterfacePtr
由_COM_SMARTPTR_TYPEDEF
定义。我不明白为什么需要明确执行p = NULL
,这意味着p->Release()
,如果此操作将在ATLCOMCLASS
dtor中自动执行。
拜托,我可以吗?
答案 0 :(得分:1)
从技术上讲,它不会让在代码中的那个点做p = NULL
,或者在任何时候显式地执行,因为析构函数会释放智能指针。但是,明确地释放它可以让你在发生时更好地控制,这可能是有用的。
根据ISomeInterface
,程序和其他因素的要求,在p
被销毁之前释放this
可能会满足某些程序条件。特别是,如果FinalRelease()
被另一个方法调用而不是 dtor,那么清理就会发生在其他地方并且可能有一个非常不同的触发器。它也可以被清理,然后在某种重置或任意数量的其他序列中重新创建一些资源。
要弄明白为什么这是有用的,假设这不是一个错误,你需要恢复可能的程序流程,看看发生了什么。