设为首页 加入收藏

TOP

遍地New却不见delete疑问(七)
2013-01-01 14:47:05 来源: 作者: 【 】 浏览:1573
Tags:遍地 New 不见 delete 疑问

  环境准备好了,那么我们开始动手操作吧。正如对数据库表操作一样---增删改查。根据此逻辑,那就从增(创建)开始。

  创建的格式如下:

  <Persons>

  <Person>

  <name>lhy</name>

  <age>22</age>

  </Person>

  </Persons>

  上篇博客中,我们也介绍了tinyxml解析器中的所有的类以及类之间的关系。

  创建上述格式的xml,代码如下:

  [html] view plaincopyprint

  //创建一个XML的文档对象。

  TiXmlDocument *myDocument = new TiXmlDocument();

  //创建一个根元素并连接。

  TiXmlElement *RootElement = new TiXmlElement("Persons");

  myDocument->LinkEndChild(RootElement);

  //创建一个Person元素并连接。

  TiXmlElement *PersonElement = new TiXmlElement("Person");

  RootElement->LinkEndChild(PersonElement);

  //创建name元素、age元素并连接。

  TiXmlElement *NameElement = new TiXmlElement("name");

  TiXmlElement *AgeElement = new TiXmlElement("age");

  PersonElement->LinkEndChild(NameElement);

  PersonElement->LinkEndChild(AgeElement);

  //设置name元素和age元素的内容并连接。

  TiXmlText *NameContent = new TiXmlText("lhy");

  TiXmlText *AgeContent = new TiXmlText("22");

  NameElement->LinkEndChild(NameContent);

  AgeElement->LinkEndChild(AgeContent);

  myDocument->SaveFile("d:\\lhy\\xml.txt");//保存到文件

  //创建一个XML的文档对象。

  TiXmlDocument *myDocument = new TiXmlDocument();

  //创建一个根元素并连接。

  TiXmlElement *RootElement = new TiXmlElement("Persons");

  myDocument->LinkEndChild(RootElement);

  //创建一个Person元素并连接。

  TiXmlElement *PersonElement = new TiXmlElement("Person");

  RootElement->LinkEndChild(PersonElement);

  //创建name元素、age元素并连接。

  TiXmlElement *NameElement = new TiXmlElement("name");

  TiXmlElement *AgeElement = new TiXmlElement("age");

  PersonElement->LinkEndChild(NameElement);

  PersonElement->LinkEndChild(AgeElement);

  //设置name元素和age元素的内容并连接。

  TiXmlText *NameContent = new TiXmlText("lhy");

  TiXmlText *AgeContent = new TiXmlText("22");

  NameElement->LinkEndChild(NameContent);

  AgeElement->LinkEndChild(AgeContent);

  myDocument->SaveFile("d:\\lhy\\xml.txt");//保存到文件

  只要搞清xml中节点之间的关系,创建不是问题。说白了就是一种辈分关系。

  创建搞定了,但是作为C++(www.cppentry.com)程序猿,写完之后,总感觉有点别扭,总感觉哪不对劲。你是否也看出其中存在的猫腻?

  对了,些许的代码中有大量的New指针。在C++(www.cppentry.com)中可没有java中的垃圾回收机制,必须自己来处理这些废弃的垃圾。但是代码中却没有Delete语句?

  上网查了资料,发现很多创建代码中,都没有Delete语句?难道是大家都是复制粘贴?还是tinyxml在搞怪?

  我总结了以下几点,但是最后在开发的过程中仍是疑问,但是开发的过程中,没有出现问题,所以我的程序就暂时如此了。

  说法一:很多文章中,都是new没有delete,是因为tinyxml可以自动释放,自动销毁指针,无需开发者手动释放。

  质疑:new出来的可以自动释放?new出来说明是在堆上创建的,什么时候会自动释放?程序结束时,自动释放?那怎么判断程序结束呢?(在一个模块中如何析构另一个模块中的内存区域,我们后面会详谈),所以这种说法不攻自破。

  既然tinyxml中有自毁功能,那我们查询其源代码,发现果真如此,tinyxml中在析构函数中,有相应的指针释放。但是并不是每个节点如此的。

  源码中的详情:

  [html] view plaincopyprint

  TiXmlNode::~TiXmlNode()

  {

  TiXmlNode* node = firstChild;

  TiXmlNode* temp = 0;

  while ( node )

  {

  temp = node;

  node = node->next;

  delete temp;

  }

  }

  void TiXmlNode::Clear()

  {

  TiXmlNode* node = firstChild;

  TiXmlNode* temp = 0;

  while ( node )

  {

  temp = node;

  node = node->next;

  delete temp;

  }

  firstChild = 0;

  lastChild = 0;

  }

  TiXmlNode::~TiXmlNode()

  {

  TiXmlNode* node = firstChild;

  TiXmlNode* temp = 0;

  while ( node )

  {

  temp = node;

  node = node->next;

  delete temp;

  }

  }

  void TiXmlNode::Clear()

  {

  TiXmlNode* node = firstChild;

  TiXmlNode* temp = 0;

  while ( node )

  {

  temp = node;

  node = node->next;

  delete temp;

  }

  firstChild = 0;

  lastChild = 0;

  }

  我们也知道tinyxml中的类之间存在继承关系。

  那我们看tinyxml中的TixmlElement类:

  [html] view plaincopyprint

  TiXmlElement::~TiXmlElement()

  {

  ClearThis();

  }

  void TiXmlElement::ClearThis()

  {

  Clear();

  while( attributeSet.First() )

  {

  TiXmlAttribute* node = attributeSet.First();

  attributeSet.Remove( node );

  delete node;

  }

  }

  TiXmlElement::~TiXmlElement()

  {

  ClearThis();

  }

  void TiXmlElement::ClearThis()

  {

  Clear();

  while( attributeSet.First() )

  {

  TiXmlAttribute* node = attributeSet.First();

  attributeSet.Remove( node );

  delete node;

  }

  }

  因为TixmlElement是继承TiXmlNode.但是在TiXmlDocument中并没有发现TiXmlDocument类的析构函数。

  第二种说法:TiXmlDocument对象就是这棵树的根结点, 在一个完整的文档中, 除了它, 其余结点必须都是它的后代, 所以TinyXml用了一个很巧妙的方法来析构每一个结点所对应的对象 ---- 每个结点的析构任务都委托给了它的父亲, 这样只要保证父亲被正确析构, 或者调用了父亲的Clear函数, 它的所有后代都会被正确的析构, 所以对整个文档来说只要TiXmlDocument对象被正确析构即可。

        

首页 上一页 4 5 6 7 下一页 尾页 7/7/7
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇C++标准库set类型 下一篇C++函数的内存分配机制

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: