【问题标题】:Segmentation fault from std::_Rb_tree_const_iterator<Type>::operator++来自 std::_Rb_tree_const_iterator<Type>::operator++ 的分段错误
【发布时间】:2025-11-30 06:00:02
【问题描述】:

迭代集合时出现分段错误。堆栈跟踪指向

std::_Rb_tree_const_iterator<Type>::operator++
std::_Rb_tree_increment()

但我没有得到更多信息。迭代器在函数返回的集合上

for (FactSet::factset_iterator fact_it = (*binSet_it).getDependencyGraph().getExtentionalFactSet().begin();
                fact_it != (*binSet_it).getDependencyGraph().getExtentionalFactSet().end();
                ++fact_it) {...}

我看不到这个问题。 提前致谢。

【问题讨论】:

    标签: c++ iterator set


    【解决方案1】:

    您不想像那样迭代返回值。每次迭代都会重新评估中间终止条件,因此您的 end() 每次都会针对不同的集合,这意味着您的迭代器永远不会到达它。

    将集合缓存在局部变量中,然后从中使用begin()end()

    【讨论】:

    • 谢谢,这很有道理。我尝试了另一种方法:for (FactSet::factset_iterator fact_it = (*binSet_it).getDependencyGraphRef().getExtentionalFactSetRef().begin();fact_it != (*binSet_it).getDependencyGraphRef().getExtentionalFactSetRef().end(); +fact_it) {...} 其中 getDependencyGraphRef 和 getExtentionalFactSetRef 返回常量引用。这是有效的。我想避免复制,因为我正在处理的结构非常大。
    • 如果要避免复制,也可以先const FactSet&amp; fset = (*binSet_it).get...,然后再使用fset。由于它是 const 引用,因此您不会产生副本。
    【解决方案2】:

    你会擦除循环中的元素吗?在这种情况下,您需要获取擦除函数的返回值(在删除元素之后将迭代器提供给第一个元素),并且您不能在该轮之后执行 ++it (这将跳过下一个元素,或者如果它已经在末尾,可能会导致 operator++ 中的段错误。

    【讨论】:

      最近更新 更多