c ++ map / set iterator not dereferencable

时间:2012-11-21 15:35:44

标签: c++ iterator multiset

我想问你一个提示,因为我是初学者,在互联网上找不到合适的答案。 我收到此错误: 调试断言失败 - map / set iterator not dereferencable 在看起来像这样的一行:

pointA = active->pointNext(timeNext);

使用 pointNext()功能,因为我看到一切正常,以及活跃的问题,我有:

active = setS.data.end();

更多信息:

有效 multiset< classA,classB :: classC> :: const_iterator

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

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

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

对于这个相当混乱的帖子感到抱歉,我想加上我的猜测,如果他们错了,就会忽视他们。如果这里的内容不清楚或缺乏某些信息,我很乐意添加它。 你能否告诉我什么原因可能导致我得到的失修错误,我应该在哪里寻找它?因为我被困住了,不知道如何继续。

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

5 个答案:

答案 0 :(得分:10)

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

  

我知道事情是在linux下运行的

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

答案 1 :(得分:3)

这是你的问题:

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
}

答案 2 :(得分:1)

您无法取消标准库的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();
}

答案 3 :(得分:0)

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

你需要添加一张支票,看看你是否在最后,如果你是,不要取消引用它。

答案 4 :(得分:0)

pointA = active->pointNext(timeNext);

尝试必须取消引用“active”以在其上调用operator->(...),但active等于setS.data.end();

end()返回>容器末尾元素的迭代器。因此,您无法取消引用它。