迭代一些空树时,Boost.PropertyTree 崩溃

Posted

技术标签:

【中文标题】迭代一些空树时,Boost.PropertyTree 崩溃【英文标题】:Boost.PropertyTree crash when iterating over some empty trees 【发布时间】: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 中的访问冲突/未定义行为。

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

【问题讨论】:

【参考方案1】:

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

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

【讨论】:

以上是关于迭代一些空树时,Boost.PropertyTree 崩溃的主要内容,如果未能解决你的问题,请参考以下文章

LeetCode110. Balanced Binary Tree-判断是否为平衡二叉树

算法——二叉树类

平衡二叉树(AVL)

二叉排序树

每当将 QWidget 添加到 QApplication 的小部件树时,如何接收事件?

数据结构手写平衡二叉树(AVL)