My regrets. Yes, I meant xmlAddChild. For clarity, the original code was like
this (error processing has been removed):
xmlNodePtr pTextNode, pChildNode;
pTextNode = xmlNewText(pUtf8Value); // pUtr8Value is an xmlCharPtr
parameter
if ( pTextNode != NULL ) {
pChildNode = xmlAddChild(pParentNode, pTextNode); // pParentNode
is an xmlNodePtr parameter
if ( pChildNode == NULL )
xmlFreeNode(pTextNode);
// ... error processing
}
else // ... error processing
To eliminate the leak, I made all of the above conditional on pUtf8Value[0] !=
'\0'. The leak seemed to be that pTextNode was neither freed nor linked when
it had empty content. I know that the document was freed after each document
was created in the loop of document creations (otherwise, the leak would have
been much larger because the document was quite large).
My original question was trying to clarify to me the "merging" condition on
whether cur was freed or not freed. My current understanding is that if the
return value of xmlAddChild differs from cur, then cur has been merged and
freed except when the return value is NULL; if the return value is the same as
cur, then it has been linked and will be freed with the parent such as when the
document is freed. Thus, cur never needs to be freed by the caller except in
error situations where xmlAddChild returns NULL. Unfortunately, that does not
explain the memory leak I was seeing.
Bruce Sinclair
Software Systems Developer - Senior Principal
Micro Focus
[email protected]
8310 N. Capital of Texas Hwy.
Building Two, Suite 100
Austin, Texas 78731-1002
Direct: +1 512 340 4717
-----Original Message-----
From: Daniel Veillard [mailto:[email protected]]
Sent: 2012 April 16 Monday 9:04 AM
To: Bruce Sinclair
Cc: [email protected]
Subject: Re: [xml] xmlAddChild question
On Mon, Apr 16, 2012 at 08:52:06AM -0500, Bruce Sinclair wrote:
> Daniel,
>
> Thanks, but I think you omitted a special case. My memory leak was
> caused when I used xmlChildNode to add an empty text node.
> The xmlChildNode function succeeded (non-null returned) but the text
You mean xmlAddChild() right ? that's what we talked about and there is no
xmlChildNode() function ?!?
> node was neither freed nor linked into the tree. This lost 109 bytes
> per occurrence and was inside a large document with many empty text
> nodes being constructed multiple times (the document was freed before
> constructing another). Eventually, the leak overwhelmed the memory
> manager. I fixed the leak by testing for an empty text node and not
> attempting to add it as a child. I was just curious if this was a bug
> or my lack of understanding of xmlChildNode. You explanation helps,
> but did not address the addition of an empty text node.
That sounds like a bug, but I really don't see how that could happen.
Actually none of the code of xmlAddChild check for a null content of a text
none. Either it appends cur->content to existing content and free cur
unconditionally or it adds the children to the list.
Are you sure it's the right function ?
Daniel
--
Daniel Veillard | libxml Gnome XML XSLT toolkit http://xmlsoft.org/
[email protected] | Rpmfind RPM search engine http://rpmfind.net/
http://veillard.com/ | virtualization library http://libvirt.org/
This message has been scanned by MailController - portal1.mailcontroller.co.uk
_______________________________________________
xml mailing list, project page http://xmlsoft.org/
[email protected]
http://mail.gnome.org/mailman/listinfo/xml