我创建了一个程序,它使用了vector.h #include和迭代器等......但是当我运行程序时,在某些情况下(我还在试图找出那些会是什么)我得到一个断言错误,将我引用到vector.h的第98行。我去了vector.h的第98行,得到了这个:
#if _HAS_ITERATOR_DEBUGGING
if (this->_Mycont == 0
|| _Myptr < ((_Myvec *)this->_Mycont)->_Myfirst
|| ((_Myvec *)this->_Mycont)->_Mylast <= _Myptr)
{
_DEBUG_ERROR("vector iterator not dereferencable");
_SCL_SECURE_OUT_OF_RANGE;
}
有人可以告诉我这意味着什么以及我的程序中有什么导致这个断言?
注意:第98行是记录的开头“_DEBUG_ERROR(”vect ...“
注意:这是我认为程序中的代码触发了错误,但我并不完全确定。
CODE:
for(aI = antiviral_data.begin(); aI < antiviral_data.end();)
{
for(vI = viral_data.begin(); vI < viral_data.end();)
{
if((*aI)->x == (*vI)->x && (*aI)->y == (*vI)->y)
{
vI = viral_data.erase(vI);
aI = antiviral_data.erase(aI);
}
else
{
vI++;
}
}
if((*aI)->x >= maxx || (*aI)->x < 0 || (*aI)->y >= maxy || (*aI)->y < 0)
{
aI = antiviral_data.erase(aI);
}
else
{
aI++;
}
}
答案 0 :(得分:10)
运行时检测到您正在取消引用在begin()之前或end()之后的迭代器。
想象一下,如果删除第7行antiviral_data
向量中的最后一项:
aI = antiviral_data.erase(aI);
aI
设置为antiviral_data.end()
,当您在第14行取消引用时:
if((*aI)->x >= maxx ...
以及第5行:
if((*aI)->x == (*vI)->x
您正在取消引用超出边界的迭代器。
修复是在擦除调用后检查aI != antiviral_data.end()
,以确保在继续使用之前没有点到向量的末尾。
答案 1 :(得分:7)
你真的想看看像remove_if
这样的STL算法,而不是手动做这个东西。
答案 2 :(得分:5)
一般性评论:在检查end()
的迭代器时,请勿使用“<
”,而只能使用“!=
”。因此,代码的第一行应如下所示:
for(aI = antiviral_data.begin(); aI != antiviral_data.end();)
{
for(vI = viral_data.begin(); vI != viral_data.end();)
{
...
然而,正如Josh已经指出的那样,你的具体错误在第7行。
答案 3 :(得分:1)
除了接受的答案,并详细说明slavy13的答案 -
(编辑 - 正如Josh所提到的,不与此问题直接相关 - 我将其留待此处参考)。
代码(但不是此代码)有时会假设您可以从向量中删除元素,并继续迭代。这是一个错误的假设 - 一旦从向量中移除元素,删除元素后面的所有其他迭代器都将失效 - 您不能再认为它们是正确的,并且如果继续使用它们就会发生“坏事”。
这是因为矢量实际上以数组形式存储信息。删除元素后,所有后续元素将被复制一个单元格。迭代器不会相应更新。
强烈建议在尝试执行此类操作时查阅STL文档,因为这样的代码完全可能会在某个STL实现上意外发生,但在其他情况下会失败。
答案 4 :(得分:-2)
擦除向量中的元素会使所有迭代器无效。