【问题标题】:Boost.PropertyTree doesn't release memory in destructorBoost.PropertyTree 不会在析构函数中释放内存
【发布时间】:2020-05-19 08:27:33
【问题描述】:

我测试以下代码

#include <boost/property_tree/xml_parser.hpp>

namespace pt = boost::property_tree;

int main()
{
  { //1
    pt::ptree xml;
    pt::read_xml("very_big_xml.xml", xml);
    // xml.clear(); //destructor should do the job
  }
  { //2
    pt::ptree xml;
    pt::read_xml("very_big_xml.xml", xml);
  }
}

在第一部分之后,我的应用程序占用了大量内存(~6GB),并且由于内存不足而在第二部分崩溃。我应该手动释放属性树吗?文档说析构函数应该清理。

注意:取消注释 xml.clear(); 没有帮助。

【问题讨论】:

  • 您尝试过std::vector&lt;type&gt;().swap(other) 技巧吗?我会尝试将 xml 与空的临时交换,看看会发生什么。
  • @BigTemp 我试过了。但这实际上与调用析构函数相同。
  • 什么版本,编译器,操作系统,编译标志?
  • @rustyx boost 1.65,Linux 上的 g++ 7.5.0,没有额外的标志。

标签: c++ xml memory boost boost-propertytree


【解决方案1】:

问题是您正在尝试将 DOM 用于非常大的 xml。

DOM 很方便且易于理解,但对于大型 xml-s 来说就失败了。

解决此问题的正确方法是使用事件驱动的SAX。 使用这种方法,您甚至可以在 32 位应用程序中处理大型 xml,而不会消耗大量内存。

现在 boost 属性树显然是 DOM 风格,它失败不是因为 ptree 被破坏了,而是这是 DOM 方法的缺点。

很可能您为 32 位平台构建了应用程序,这使得应用程序具有 3GB 内存限制。

【讨论】:

  • 你是对的 - SAX 更适合处理非常大的 xml。但这不是问题的答案,严格来说。
【解决方案2】:

对我来说很好,boost::property_tree 析构函数正在按预期释放内存(Boost 1.73)。

尝试在gdb 下运行,并在应用崩溃时获取回溯 (bt)。

还可以尝试在valgrind 下运行一个较小的文件,看看它是否报告了任何泄漏。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-10-25
    • 2014-11-12
    • 2017-08-19
    • 1970-01-01
    • 1970-01-01
    • 2017-05-25
    • 2013-01-04
    • 1970-01-01
    相关资源
    最近更新 更多