Hi Daniel, Nice stuff ! On Fri, 2007-03-30 at 05:38 -0400, Daniel Veillard wrote: > +char * > +virXPathString(const char *xpath, xmlXPathContextPtr ctxt) { ... > + ret = (char *) obj->stringval; > + obj->stringval = NULL; > +int > +virXPathNodeSet(const char *xpath, xmlXPathContextPtr ctxt, xmlNodePtr **list) { ... > + if (list != NULL) { > + *list = obj->nodesetval->nodeTab; > + obj->nodesetval->nodeTab = NULL; > + } This is all a little voodooish to me - e.g. you're assuming that libxml2 allocated these with malloc() and you're also kind of breaking the abstraction of xmlXPathObject by manipulating the structure like this. i.e. you know this works, because you wrote libxml2, but you're not using the abstraction very cleanly. I'd suggest either: - copy the memory from the xmlXPathObject and return that - make the functions return "libxml memory" and use xmlFree() in the callers Cheers, Mark.