繁体   English   中英

c ++ map / set iterator not dereferencable

[英]c++ map/set iterator not dereferencable

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

pointA = active->pointNext(timeNext);

使用函数pointNext(),因为我看到一切正常,有什么问题是活跃的 ,我有:

active = setS.data.end();

更多信息:

activemultiset <classA,classB :: classC> :: const_iterator

setS有: setS.Q,setS.W,setS.TsetS.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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM