【问题标题】:Boost.PropertyTree crash when iterating over some empty trees迭代一些空树时,Boost.PropertyTree 崩溃
【发布时间】:2019-04-29 16:16:01
【问题描述】:

循环一个空的 Boost.PropertyTree 的子节点通常是一个空操作:

ptree empty;
for (auto const& elements : empty)
{
    std::cout << "child\n"; // Executed 0 times, as expected
}

但有时它会因访问冲突而崩溃:

ptree empty;
for (auto const& elements : empty.get_child("non-existent", ptree{})))
{
    std::cout << "child\n";
}

访问冲突读取位置 0xFFFFFFFFFFFFFFFF。

(在basic_ptree&lt;K, D, C&gt;::begin() const内)

现在empty 显然没有子“不存在”,但提供了一个默认值 (ptree{})。我们从第一个例子中知道循环一个空集合是可以的。

usual way to detect a read failure 不起作用,因为这是 Boost.PropertyTree 中的访问冲突/未定义行为。

如何区分第一种和第二种类型的空属性树,从而避免迭代爆炸的类型?

【问题讨论】:

    标签: c++ boost boost-propertytree


    【解决方案1】:

    问题在于 Boost.PropertyTree 通过 const 引用采用该默认值(临时)。而临时的dies immediately,甚至在begin 被调用之前。

    您无法在运行时检测到此问题。解决方法是使用非临时空ptree 作为默认值。这可以是const ptree,因此您可以在不同的呼叫之间共享它。另一种解决方案是使用this trick

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-12-31
      • 1970-01-01
      • 1970-01-01
      • 2019-09-29
      • 1970-01-01
      • 2016-04-23
      相关资源
      最近更新 更多