关于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