遍历一些空树时,Boost.PropertyTree崩溃

时间:2019-04-29 16:16:01

标签: c++ boost boost-propertytree

在空的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";
}
  

访问冲突读取位置0xFFFFFFFFFFFFFFFFFF。

     

(在basic_ptree<K, D, C>::begin() const内部)

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

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

如何区分空属性树的第一类型和第二类型,从而避免重复遍历爆炸的类型?

1 个答案:

答案 0 :(得分:1)

问题是Boost.PropertyTree通过const引用采用了默认值(一个临时值)。临时dies immediately,甚至在调用begin之前。

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