【问题标题】:c++ map/set iterator not dereferencablec++ map/set iterator not dereferencable
【发布时间】:2012-11-09 21:41:32
【问题描述】:

我想问你一个提示,因为我是初学者,在互联网上找不到任何合适的答案。 我收到此错误: 调试断言失败 - 映射/设置迭代器不可取消引用 在看起来像这样的行:

pointA = active->pointNext(timeNext);

使用 pointNext() 函数,我看到一切正常,而 active 的问题是:

active = setS.data.end();

更多信息:

activemultiset::const_iterator

setS 有:setS.Q、setS.W、setS.TsetS.data, 其中 setS.data 在方括号内有 0。 当我在 .cpp 文件中有多重集迭代器声明时,在调试期间我无法进入查看内部活动的内容,当它在 .h 文件中时,我可以。

在.cpp中我无法进入active,所以可以想象它就像指针(迭代器)不能取消引用,因为里面是错误的。如果它为空,即 setS.data 为空怎么办?还是里面有垃圾?

我知道这个东西以前在 linux 下运行,是否有一些我必须更改才能在 Windows 上运行的功能?例如将多个模板参数更改为一个? (正确地将 setS.data 归于 active,因为我不确定 - 我是否正确执行?

对不起,这篇相当混乱的帖子,我想添加我的猜测,如果他们错了,请忽略他们。如果这里有什么不清楚或缺少一些信息,我很乐意补充。 你能告诉我什么原因可能导致我得到解引用错误,我应该在哪里寻找它?因为我被卡住了,不知道如何继续。

非常感谢任何帮助,谢谢!

【问题讨论】:

    标签: c++ iterator multiset


    【解决方案1】:

    很简单,因为active 指向容器的end(),所以你不能取消引用它。

    我知道这个东西以前是在 linux 下运行的

    如果代码完全像这样并且正在“运行”,这意味着错误从未以您注意到的方式表现出来。

    【讨论】:

    • 当然,现在我明白了。如果我有,您能否解释一下:multiset< classA, classB::classC >::const_iterator active;SomeClass setS;std::multiset<classA,classB::classC > data;(最后一个是命名空间 vlr 中某个类的公共成员)--> 多重集的第一个模板参数和第二个模板参数到底是什么?我感觉我不明白到底是什么原因,也许经过一些解释后我可以更好地找到错误。谢谢!
    • @eco_student:集合的第二个参数是用于比较第一个参数的对象的类型。记住集合是一个有序的容器,所以这里classB::classC 是一个比较器类型,可以比较classA 类型的对象。见:sgi.com/tech/stl/multiset.html
    【解决方案2】:

    您不能对标准库的 end() 函数返回的迭代器进行取消引用,因为这是“最后一个元素之后的一个”。通常,您会遍历有效范围,即在到达end() 之前停止

    for(someIteratorType it = setS.data.begin(); it != setS.data.end(); ++it)
    {
      it->someMethod();
    }
    

    或者,在 C++11 中,

    for (const auto& elem : setS.data)
    {
      elem.someMethod();
    }
    

    【讨论】:

    • 对不起,我说过我是初学者。所以现在我结束了 end()begin() 并在表达式中尝试了这个迭代器:newSet.insert(*active),我得到了同样的错误!正如我在 setS.data 中所说的那样,它是 0,但在 active 中却分配了一些奇怪的数字。这是否意味着我的问题是,active 中有垃圾?
    • @user1578163 也许你可以用一些代码来说明问题?否则很难理解问题所在。
    • active = setS.data.begin(); newSet.insert(*active); pointA = active->pointNext(timeNext); 我现在在第二行收到此错误。所以我想知道原因是否为空 setS.data (以及 active 中的 -6.2774385622041925e+066 之类的数字),以及我是否应该开始进入data 更复杂,或者问题出在其他地方。你怎么看?
    【解决方案3】:

    end() 指向最后一个元素之后的元素。所以 end() 是不可取消引用的。

    您需要添加一个检查以查看您是否在末尾,如果是,请不要取消引用它。

    【讨论】:

      【解决方案4】:

      这是你的问题:

      active = setS.data.end();
      

      这会返回一个迭代器,指向通过容器末端的迭代器。
      因此,它指向的项目无效。您也不能在迭代器所引用的对象上调用任何方法。

      如果你这样做了:

      active = setS.data.end();
      if (setS.data.begin() != active)
      {
          // make sure the set is not empty first
          --active;
          active->methodCall(); // This would be OK
      }
      

      【讨论】:

        【解决方案5】:
        pointA = active->pointNext(timeNext);
        

        tries 必须取消引用 "active" 才能在其上调用 operator->(...),但 active 等于 setS.data.end();

        end() 将迭代器返回到容器末尾 之后的元素。因此,您不能取消引用它。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2013-06-25
          • 1970-01-01
          • 2017-09-28
          • 1970-01-01
          • 2018-04-17
          • 2013-04-10
          • 1970-01-01
          • 2016-06-10
          相关资源
          最近更新 更多