智能指针在最终版本中明确发布

Smart pointers release in FinalRelease explicitly

本文关键字:版本 指针 智能      更新时间:2023-10-16

我正在处理的某些项目类看起来像这样

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

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

你能解释一下我吗?

从技术上讲,它不必在代码中的该点执行p = NULL,也不必在任何时候显式执行,因为析构函数将释放智能指针,如您所指出的。但是,显式释放它可以让你更好地控制它何时发生,这可能是有用的。

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

要弄清楚为什么这很有用,假设这不是一个错误,你需要备份可能的程序流,看看发生了什么。