迭代一些空树时,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<K, D, C>::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-判断是否为平衡二叉树