gpt4 book ai didi

c++ - Boost.PropertyTree 在遍历一些空树时崩溃

转载 作者:行者123 更新时间:2023-11-28 04:18:57 25 4
gpt4 key购买 nike

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

Access violation reading location 0xFFFFFFFFFFFFFFFF.

(Inside basic_ptree<K, D, C>::begin() const)

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

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

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

最佳答案

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

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

关于c++ - Boost.PropertyTree 在遍历一些空树时崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55907208/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com