如何修复xmlNodeGetContent在SOAP XML解析中的内存泄漏问题?
解决SOAP XML解析中xmlNodeGetContent的内存泄漏问题
xmlNodeGetContent会动态分配内存存储节点内容,必须调用xmlFree()显式释放返回的指针,否则会引发内存泄漏,这也是Valgrind检测到问题的根源。针对你提供的递归解析代码,修改方式如下:
核心修改点
在使用xmlNodeGetContent获取内容后,先将其转换为std::string,再用xmlFree()释放原始指针,避免内存泄漏:
if( (XML_ELEMENT_NODE == childNode->type) && ( 0 == xmlChildElementCount(childNode) ) ) { std::string name = (const char*)childNode->name; // 保存API返回的动态分配指针 char* content_ptr = (char*)xmlNodeGetContent(childNode); // 转换为std::string,完成数据拷贝 std::string value = content_ptr; soapHeaderAttributes.insert(std::make_pair(name, value)); // 显式释放内存 xmlFree(content_ptr); }
递归场景注意事项
对于递归调用的getSoapMsgDetails和getSoapMsgMoList函数,只要内部使用了xmlNodeGetContent,就必须遵循同样的规则:每一次调用xmlNodeGetContent后,都要对应调用xmlFree()释放返回的指针,确保递归过程中每一块动态分配的内存都被正确回收。
额外提示
代码中xmlNode childNode=node->children;存在语法错误,应该改为指针类型xmlNode* childNode = node->children;,否则会导致编译或运行异常。
内容的提问来源于stack exchange,提问作者Neeraj
相关产品推荐
相关产品推荐

