这几日一直在抽空用tinyXml来配置OSG场景图,刚把读的问题解决,准备着手由程序把场景图写入XML的问题,回顾以前熟悉tinyXml写的读写xml的程序,发现new出来的tinyXmlNode节点都没delete,这必然存在内存泄露,今天用_CrtDumpMemoryLeaks()查了一下,果然是。
然后我把所有 tinyXmlNode节点都delete了,结果报错,查了一下TiXmlNode的源码(开源的好处),TiXmlNode的析构函数如下:
TiXmlNode::~TiXmlNode()
{
TiXmlNode* node = firstChild;
TiXmlNode* temp = 0;
while ( node )
{
temp = node;
node = node->next;
delete temp;
}
}
原来对于子节点的释放工作,TiXmlNode已经帮我们做好了,这就方便了,在我以前的程序里直接delete pXmlDoc这个根节点就OK了。
再查一下,果然没有内存泄露了。
另外,TiXmlNode还有一个clear()函数用来释放子节点,不过对当前节点不做处理 ,如果你的当前节点还有用,但子节点无用了,用这个函数也是很方便的。
另外,我看到网上有人如此释放内存
pXmlDoc = NULL;
delete pXmlDoc;
经检验这样只是释放了当前节点而没能释放子节点。我想是应为当你将根节点设为NULL后,打破了其与子节点的联系,子节点便不能被自动释放了。