6

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

pointA = active->pointNext(timeNext);

使用pointNext()函数,我看到一切正常,而关于active,我有:

active = setS.data.end();

更多信息:

活动多集< classA, classB::classC >::const_iterator

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

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

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

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

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

4

5 回答 5

11

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

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

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

于 2012-11-21T15:37:51.460 回答
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
}
于 2012-11-21T15:39:28.200 回答
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();
}
于 2012-11-21T15:38:01.147 回答
0

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

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

于 2012-11-21T15:38:07.577 回答
0
pointA = active->pointNext(timeNext);

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

end() 返回一个迭代器,指向容器结束后的元素。因此,您不能取消引用它。

于 2012-11-21T15:39:34.620 回答