今天,我试图从我的项目中查找内存泄漏,然后遇到了以下示例代码
std::string VersionValue("1.0");
std::string EncodingValue("UTF-8");
rapidxml::xml_document<> XMLDoc;
rapidxml::xml_node<> * pHeaderNode = XMLDoc.allocate_node(rapidxml::node_declaration);
pHeaderNode->append_attribute(XMLDoc.allocate_attribute("version", VersionValue.c_str()));
pHeaderNode->append_attribute(XMLDoc.allocate_attribute("encoding", EncodingValue.c_str()));
我打开了Rapidxml代码,在allocate_attribute()里面看到了它的分配内存
xml_attribute<Ch> *attribute = new(memory) xml_attribute<Ch>;
在
append_attribute()
内部,将内存分配给其成员变量。没有为
xml_document
声明析构函数。那么如何删除其属性?从上述示例代码返回valgrind 0内存泄漏。怎么可能? 最佳答案
如评论中所述,新的位置就是答案。
这种行为是Rapidxml的主要好处之一,也是最常见的陷阱之一:它不会复制任何作为参数传递的数据。
例如,如果您的代码如下所示:
rapidxml::xml_document<> XMLDoc;
rapidxml::xml_node<> * pHeaderNode =
XMLDoc.allocate_node(rapidxml::node_declaration);
{
std::string VersionValue("1.0");
std::string EncodingValue("UTF-8");
pHeaderNode->append_attribute(XMLDoc.allocate_attribute("version", VersionValue.c_str()));
pHeaderNode->append_attribute(XMLDoc.allocate_attribute("encoding", EncodingValue.c_str()))
}
...那么通常会遇到主要问题,因为属性字符串将超出范围,但是Rapidxml将继续保留指向它们的陈旧指针。
关于c++ - Rapidxml没有泄漏,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/49628558/