我想问你一个提示,因为我是初学者,在互联网上找不到合适的答案。 我收到此错误: 调试断言失败 - 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 正确归结为有效,因为我不确定 - 我是否正确执行?
对于这个相当混乱的帖子感到抱歉,我想加上我的猜测,如果他们错了,就会忽视他们。如果这里的内容不清楚或缺乏某些信息,我很乐意添加它。 你能否告诉我什么原因可能导致我得到的失修错误,我应该在哪里寻找它?因为我被困住了,不知道如何继续。
任何帮助非常感谢,谢谢!
答案 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()返回>>容器末尾元素的迭代器。因此,您无法取消引用它。