当前位置:编程学习 > C/C++ >>

C++中遍地New却不见delete疑问重重

在上篇博客中,大概了解了tinyxml工具的架构,那这篇博客,我们详细讲述如何利用tinyxml操纵xml。以及在操作的过程中,我们应该注意的问题。
    
     首先把tinyxml源文件导入自己的工程中,效果如下:
    \

    实际上,直接添加文件到工程中:如下:\
 
    若您的系统是win7或office是2007以上的,添加文件这个功能是不能用的,结果是:或直接崩溃。或没反应。     
     环境准备好了,那么我们开始动手操作吧。正如对数据库表操作一样---增删改查。根据此逻辑,那就从增(创建)开始。
     创建的格式如下:
     <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++程序猿,写完之后,总感觉有点别扭,总感觉哪不对劲。你是否也看出其中存在的猫腻?
    对了,些许的代码中有大量的New指针。在C++中可没有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;
     }  

补充:软件开发 , C++ ,
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,