智能指针在FinalRelease中明确释放

时间:2012-02-28 12:55:44

标签: c++ com atl raii

我正在研究的一些项目类似于

class ATLCOMCLASS<CComObjectRootEx<ATLCOMCLASS> >
{
  ISomeInterfacePtr p;
  /*some stuff*/
  void FinalRelease()
  {
    p = NULL;
  }
}

ISomeInterfacePtr_COM_SMARTPTR_TYPEDEF定义。我不明白为什么需要明确执行p = NULL,这意味着p->Release(),如果此操作将在ATLCOMCLASS dtor中自动执行。

拜托,我可以吗?

1 个答案:

答案 0 :(得分:1)

从技术上讲,它不会在代码中的那个点做p = NULL,或者在任何时候显式地执行,因为析构函数会释放智能指针。但是,明确地释放它可以让你在发生时更好地控制,这可能是有用的。

根据ISomeInterface,程序和其他因素的要求,在p被销毁之前释放this可能会满足某些程序条件。特别是,如果FinalRelease()被另一个方法调用而不是 dtor,那么清理就会发生在其他地方并且可能有一个非常不同的触发器。它也可以被清理,然后在某种重置或任意数量的其他序列中重新创建一些资源。

要弄明白为什么这是有用的,假设这不是一个错误,你需要恢复可能的程序流程,看看发生了什么。