• 关于CArrayPtrFlat 的 reset 的方法


    先看代码 

    iChildList 是 CArrayPtrFlat<CXmlNode>* 的指针变量

    CXmlNode* CXmlNode::AddChildNote(const TDesC& aNodeName)
     {
      CXmlNode* aNode = CXmlNode::NewL(aNodeName);
      this->iChildList->AppendL(aNode);
      return aNode;
     }

    ----

    CXmlNode* node = doc->Root();
      CArrayFixFlat<TInt>* sels = this->GetSelectionsNewL(aListBox);
      CleanupStack::PushL(sels);
      for(TInt i=0;i<sels->Count();i++)
       {
        TPtrC pId = (*this->iIdList)[i];
        TPtrC pName = (*this->iNameList)[i];
        TPtrC pPhone = (*this->iPhoneList)[i];
        CXmlNode* aNode = node->AddChildNote(bufPhone);
        CXmlNode* idNode = aNode->AddChildNote(bufId);
        idNode->SetValue(pId);
        CXmlNode* nameNode = aNode->AddChildNote(bufName);
        nameNode->SetValue(pName);
        CXmlNode* numNode = aNode->AddChildNote(bufNum);
        numNode->SetValue(pPhone);
       }

    当我通过上面的代码这样创建后,如果我删除 node 时,同时也删除 iChildList 这个变量,

    这时我想把 iChildList 中保存的对像也删除了,但 iChildList中的对像可能还有 iChildList ,这样就是一个

    对像的树了,我用 iChildList.Reset() ,当时想 iChildList  调用 Reset() 时,每删除一个变量,则会调用这个变量的

    析构方法,就达到了删除所有变量的效果,但是实际上不会那样做,结果内存发生溢出了

    后来采用

    void CXmlNode::FreeChildNote()
     {
      for(TInt i =this->iChildList->Count()-1;i>=0;i--)
       {
        CXmlNode* aNode = this->iChildList->At(i);
        aNode->FreeChildNote();
        delete aNode;
        this->iChildList->Delete(i);
       }
     }

    这样分别释放就没有问题了

     再次实验,只添加一级对像,也就是不在对像中保存对像

    for(TInt i=0;i<sels->Count();i++)
       {
        TPtrC pId = (*this->iIdList)[i];
        TPtrC pName = (*this->iNameList)[i];
        TPtrC pPhone = (*this->iPhoneList)[i];
        CXmlNode* aNode = node->AddChildNote(bufPhone);
        //CXmlNode* idNode = aNode->AddChildNote(bufId);
        //idNode->SetValue(pId);
        //CXmlNode* nameNode = aNode->AddChildNote(bufName);
        //nameNode->SetValue(pName);
        //CXmlNode* numNode = aNode->AddChildNote(bufNum);
        //numNode->SetValue(pPhone);
        
       }

    把其余的代码注释,释放改成 reset ,结果还是错误,看来不能信任这个 Reset了

    补充:还是对这个动态数组不太清楚呀,后来采用ResetAndDestroy()来释放

    对像就没有问题了



    安平2009@原创
    qi_jianzhou@126.com

  • 相关阅读:
    mysql 存储结构
    Mysql 创建表
    java 定时任务
    SpringBoot
    Spring : Spring初识(二)
    hadoop
    JAVA学习路线图
    redis缓存和cookie实现Session共享
    说说 JAVA 代理模式
    Spring 学习教程(五):快速入门
  • 原文地址:https://www.cnblogs.com/zziss/p/1774548.html
Copyright © 2020-2023  润新知