c++ 映射/集合迭代器不可取消引用

问题描述 投票:0回答:5

我想向您寻求提示,因为我是初学者,在互联网上找不到任何合适的答案。 我收到此错误: 调试断言失败 - 映射/设置迭代器不可解除引用 在看起来像这样的行:

pointA = active->pointNext(timeNext);

使用函数 pointNext(),我看到一切都很好,而关于 active,我有:

active = setS.data.end();

更多信息:

activemultiset< 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,因为我不确定 - 我做得正确吗?

抱歉这篇文章相当混乱,我想添加我的猜测,以便有人在他们错误的情况下忽略他们。如果这里有不清楚或缺少某些信息的地方,我很乐意添加。 您能否告诉我哪些原因可能导致我收到取消引用错误以及我应该在哪里查找它?因为我被困住了,不知道如何继续。

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

c++ iterator multiset
5个回答
11
投票

很简单,由于

active
指向容器的
end()
,因此不允许您取消引用它。

我知道这个东西之前是在linux下运行的

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


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
}

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(); }



0
投票

您需要添加一个检查来查看是否位于末尾,如果是,请勿取消引用它。


0
投票
tries 必须取消引用“active”才能对其调用operator->(...),但 active 等于 setS.data.end();

end() 返回一个指向容器末尾

after

元素的迭代器。因此,您无法取消引用它。

© www.soinside.com 2019 - 2024. All rights reserved.