现在的位置: 首页 > 综合 > 正文

关于CArrayPtrFlat 的 reset 的方法

2013年02月13日 ⁄ 综合 ⁄ 共 1780字 ⁄ 字号 评论关闭

先看代码 

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

抱歉!评论已关闭.