今天,我试图从我的项目中查找内存泄漏,然后遇到了以下示例代码

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/

10-11 22:46