Explorar o código

start working through memory bugs

Lee Thomason %!s(int64=11) %!d(string=hai) anos
pai
achega
cd011bc1b7
Modificáronse 3 ficheiros con 38 adicións e 13 borrados
  1. 21 3
      tinyxml2.cpp
  2. 6 6
      tinyxml2.h
  3. 11 4
      xmltest.cpp

+ 21 - 3
tinyxml2.cpp

@@ -1765,6 +1765,24 @@ static FILE* callfopen( const char* filepath, const char* mode )
 #endif
     return fp;
 }
+    
+void XMLDocument::DeleteNode( XMLNode* node )	{
+    TIXMLASSERT( node );
+    TIXMLASSERT(node->_document == this );
+    if (node->_parent) {
+        node->_parent->DeleteChild( node );
+    }
+    else {
+        // Isn't in the tree.
+        // Use the parent delete.
+        // Also, we need to mark it tracked: we 'know'
+        // it was never used.
+        node->_memPool->SetTracked();
+        // Call the static XMLNode version:
+        XMLNode::DeleteNode(node);
+    }
+}
+
 
 XMLError XMLDocument::LoadFile( const char* filename )
 {
@@ -1949,9 +1967,9 @@ XMLPrinter::XMLPrinter( FILE* file, bool compact, int depth ) :
             _entityFlag[ (int)entities[i].value ] = true;
         }
     }
-    _restrictedEntityFlag[(int)'&'] = true;
-    _restrictedEntityFlag[(int)'<'] = true;
-    _restrictedEntityFlag[(int)'>'] = true;	// not required, but consistency is nice
+    _restrictedEntityFlag['&'] = true;
+    _restrictedEntityFlag['<'] = true;
+    _restrictedEntityFlag['>'] = true;	// not required, but consistency is nice
     _buffer.Push( 0 );
 }
 

+ 6 - 6
tinyxml2.h

@@ -1555,7 +1555,11 @@ public:
 
     /**
     	Load an XML file from disk. You are responsible
-    	for providing and closing the FILE*.
+    	for providing and closing the FILE*. 
+     
+        NOTE: The file should be opened as binary ("rb")
+        not text in order for TinyXML-2 to correctly
+        do newline normalization.
 
     	Returns XML_NO_ERROR (0) on success, or
     	an errorID.
@@ -1665,11 +1669,7 @@ public:
     	Delete a node associated with this document.
     	It will be unlinked from the DOM.
     */
-    void DeleteNode( XMLNode* node )	{
-        TIXMLASSERT( node );
-        TIXMLASSERT( node->_parent );
-        node->_parent->DeleteChild( node );
-    }
+    void DeleteNode( XMLNode* node );
 
     void SetError( XMLError error, const char* str1, const char* str2 );
 

+ 11 - 4
xmltest.cpp

@@ -1334,10 +1334,10 @@ int main( int argc, const char ** argv )
 
 	{
 		// Test that it doesn't crash.
-		const char* xml = "<?xml version=\"1.0\"?><root><sample><field0><1</field0><field1>2</field1></sample></root>";
-		XMLDocument doc;
-		doc.Parse(xml);
-		doc.PrintError();
+		const char* xml = "<?xml version=\"1.0\"?><root><sample><field0><1</field0><field1>2</field1></sample></root>";
+		XMLDocument doc;
+		doc.Parse(xml);
+		doc.PrintError();
 	}
 
 #if 1
@@ -1390,6 +1390,13 @@ int main( int argc, const char ** argv )
             doc.Clear();
         }
     }
+    
+    {
+        // If this doesn't assert in DEBUG, all is well.
+        tinyxml2::XMLDocument doc;
+        tinyxml2::XMLElement *pRoot = doc.NewElement("Root");
+        doc.DeleteNode(pRoot);
+    }
 
 
 	// ----------- Performance tracking --------------