2012-02-28 67 views
0

项目的一些课程我工作的这个样子的智能指针释放FinalRelease明确

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

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

请问您可以请我吗?

回答

1

从技术上讲,它不具有在代码中,或在任何时候明确这一点上做的p = NULL,因为析构函数将释放智能指针正如你指出。但是,明确发布它可以更好地控制发生时的情况,这可能是有用的。

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

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