【问题标题】:No leaks from rapidxmlrapidxml 没有泄漏
【发布时间】:2018-04-03 11:08:42
【问题描述】:

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

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 个内存泄漏。怎么可能?

【问题讨论】:

  • @Joe new 必须在某个时候被删除,对吧?
  • 看起来是新的展示位置
  • new(memory) 没有分配任何东西,而是使用*memory 已经存在的内存。
  • 谢谢@Alexander 我不知道安置新

标签: c++ rapidxml


【解决方案1】:

正如 cmets 中提到的,新位置就是答案。

这种行为是 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 将继续持有指向它们的陈旧指针。

【讨论】:

  • 当 XMLDoc 超出范围时,xapidxml 将清理内存池,还是在超出分数之前我们必须调用 clear() 并清理内存池?有什么方法可以知道 rapidxaml 正在池化多少内存?
  • RapidXMl 内部分配的东西当然会被清理掉。但是请阅读手册中有关“字符串的所有权”和“源文本的生命周期”的内容。 rapidxml.sourceforge.net/… 因为 RapidXML 不拥有“UTF-8”属性字符串(在上面的代码中),它不会删除它 - 而且它也不会知道它何时超出范围。
猜你喜欢
  • 2019-12-20
  • 1970-01-01
  • 2013-04-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多