[英]c++ map/set iterator not dereferencable
我想问你一个提示,因为我是初学者,在互联网上找不到合适的答案。 我收到此错误: debug assertion failed - map / set iterator not dereferencable在看起来像这样的行:
pointA = active->pointNext(timeNext);
使用函数pointNext(),因为我看到一切正常,有什么问题是活跃的 ,我有:
active = setS.data.end();
更多信息:
active是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归为活动 ,因为我不确定 - 我是否正确地做到了?
对于这个相当混乱的帖子感到抱歉,我想加上我的猜测,如果他们错了,就会忽视他们。 如果这里的内容不清楚或缺乏某些信息,我很乐意添加它。 你能否告诉我什么原因可能导致我得到的失修错误,我应该在哪里寻找它? 因为我被困住了,不知道该怎么办。
任何帮助非常感谢,谢谢!
很简单,因为active
指向容器的end()
,所以不允许取消引用它。
我知道之前在linux下运行的东西
如果代码完全像这样并且“正在运行”,那么这一切意味着错误从未以您注意到的方式表现出来。
这是你的问题:
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
}
你不能去除由标准库的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()指向最后一个元素之后的元素。 所以end()不是dereferecable。
您需要添加一个检查,看看您是否在最后,如果您是,请不要取消引用它。
pointA = active->pointNext(timeNext);
尝试必须取消引用“active”来调用operator - >(...),但active等于setS.data.end();
end()在容器结束后返回元素的迭代器。 因此,您无法取消引用它。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.