diff --git a/tinyxml2.cpp b/tinyxml2.cpp index ef3b469..bc34c1f 100755 --- a/tinyxml2.cpp +++ b/tinyxml2.cpp @@ -70,6 +70,29 @@ StrPair::~StrPair() } +void StrPair::TransferTo( StrPair* other ) +{ + if ( this == other ) { + return; + } + // This in effect implements the assignment operator by "moving" + // ownership (as in auto_ptr). + + TIXMLASSERT( other->_flags == 0 ); + TIXMLASSERT( other->_start == 0 ); + TIXMLASSERT( other->_end == 0 ); + + other->Reset(); + + other->_flags = _flags; + other->_start = _start; + other->_end = _end; + + _flags = 0; + _start = 0; + _end = 0; +} + void StrPair::Reset() { if ( _flags & NEEDS_DELETE ) { @@ -824,7 +847,7 @@ char* XMLNode::ParseDeep( char* p, StrPair* parentEnd ) // We read the end tag. Return it to the parent. if ( ele && ele->ClosingType() == XMLElement::CLOSING ) { if ( parentEnd ) { - *parentEnd = ele->_value; + ele->_value.TransferTo( parentEnd ); } node->_memPool->SetTracked(); // created and then immediately deleted. DeleteNode( node ); diff --git a/tinyxml2.h b/tinyxml2.h index a911003..7bcbfeb 100755 --- a/tinyxml2.h +++ b/tinyxml2.h @@ -184,9 +184,9 @@ public: char* ParseText( char* in, const char* endTag, int strFlags ); char* ParseName( char* in ); -private: - void operator=(const StrPair& rhs); + void TransferTo( StrPair* other ); +private: void Reset(); void CollapseWhitespace(); @@ -199,6 +199,9 @@ private: int _flags; char* _start; char* _end; + + StrPair( const StrPair& other ); // not supported + void operator=( StrPair& other ); // not supported, use TransferTo() }; diff --git a/xmltest.cpp b/xmltest.cpp index 805b3ce..206c3a4 100644 --- a/xmltest.cpp +++ b/xmltest.cpp @@ -1442,12 +1442,10 @@ int main( int argc, const char ** argv ) #if defined( _MSC_VER ) && defined( DEBUG ) _CrtMemCheckpoint( &endMemState ); - //_CrtMemDumpStatistics( &endMemState ); _CrtMemState diffMemState; _CrtMemDifference( &diffMemState, &startMemState, &endMemState ); _CrtMemDumpStatistics( &diffMemState ); - //printf( "new total=%d\n", gNewTotal ); #endif printf ("\nPass %d, Fail %d\n", gPass, gFail);