HRESULT FinalConstruct()
{
    p=NULL ;              // p,p1 is a pointer which point to char
    p1=NULL ;   
   p=new char[100];
    if(p== NULL)
         return  E_OUTOFMEMORY ;
   p1=new  char[100] ;
  if(p1== NULL)
    return E_OUTOFMEMORY }void  FianlRelease()
{
   if(p!=NULL)
     delete []p ;
 if(p1!=NULL)
     delete []p1;} 
如果p 分配内存成功 ,p1 分配不成功, 就会return E_OUTOFMEMORY , return 
后还会调用  FianlRelease() 吗? 如果不调用,是不是 p的内存就没有释放,
泄漏了?
请大家执教!!! 谢谢!

解决方案 »

  1.   

    那要看你在哪里调FianlRelease()了。
      

  2.   

    如果p分配成功,p1失败,这时候及时调用finalrelease,可以避免内存泄漏
    如果没调用,p的内存肯定泄漏了
    如果都申请成功,在用完后,也要调用finalrelease释放所有内存
      

  3.   

    在 ATL 中 FianlRelease() 是调用是默认的  ,楼上也许忘了!
      

  4.   

    肯定会泄漏。最好把这些放到构造中去,ATL 中 FianlRelease() 主要用来初始化对象的,如果初始化失败可以调用宏DECLARE_PROTECT_FINAL_CONSTRUCT来保护对象使它deleted
      

  5.   

    FianlRelease()是在CoClass的析构函数中调用的,这时回收内存太晚了吧,FinalConstruct()中既然知道内存泄漏了为什么不就地及时回收?
      

  6.   

    我想知道 在ATL 中抛 出 E_FAIL , E_OUTOFMEMORY 等错误后,程序的执行流程会发生什么样的变化呢?比如在 FinalConstruct()中 抛 出 E_******** 错误后,程序的执行会发生怎样的变化?
     FinalRelease(),类 的虚构函数都不会执行了吗?
      

  7.   

    如果不想失败后内存泄露,可以改成如下形式:
    HRESULT FinalConstruct()
    {
        p=NULL ;              // p,p1 is a pointer which point to char
        p1=NULL ;   
       p=new char[100];
        if(p== NULL)
             return  E_OUTOFMEMORY ;
       p1=new  char[100] ;
      if(p1== NULL)
      {
        FianlRelease();
        return E_OUTOFMEMORY ;
       }
    }
    这样不是很好吗?
      

  8.   

    p=NULL ;              // p,p1 is a pointer which point to char
     p1=NULL ;   
     p=new char[100];
     p1=new  char[100] ;
     if(p1== NULL || p == NULL)
    {
        FianlRelease();
        return E_OUTOFMEMORY 
    }
      

  9.   

    FianlRelease()是析构函数用的,即使错误返回了,也会自动调用的,FianlRelease()不应该显式调用,就像没人会显式调用析构函数一样。
      

  10.   

    我跟了一下,E_OUTOFMEMORY 时FianlRelease()可以执行,但是当你一创建对象它就会立马执行,它回认为对象创建不成功直接Release掉。
    看看源代码:
    HRESULT FinalConstruct()
    {
    CComObjectRootEx<contained::_ThreadModel::ThreadModelNoCS>::FinalConstruct();
    return m_contained.FinalConstruct();
    }
    void FinalRelease()     //会直接执行到这里
    {
    CComObjectRootEx<contained::_ThreadModel::ThreadModelNoCS>::FinalRelease();
    m_contained.FinalRelease();
    }