我创建了一个程序,它使用了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...“
注意:这是我的程序中的代码,我认为是它触发了这个错误,但我不能完全确定。
代码:
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++;
}
}发布于 2009-05-15 02:47:21
运行库检测到您正在取消引用begin()之前或end()之后的迭代器。
想象一下,如果您删除了antiviral_data向量中第7行的最后一项:
aI = antiviral_data.erase(aI);aI被设置为antiviral_data.end(),当您在第14行取消对它的引用时:
if((*aI)->x >= maxx ...同样在第5行:
if((*aI)->x == (*vI)->x您正在取消引用超出边界的迭代器。
修复方法是在erase调用之后检查aI != antiviral_data.end(),以确保在继续使用它之前没有到达向量末尾。
发布于 2009-05-15 03:03:02
你真的想看看像remove_if这样的STL算法,而不是手动做这些事情。
发布于 2009-05-15 03:22:33
一个小的通用注释:当检查end()的迭代器时,不要使用"<“,而只使用"!=”。因此,代码的第一行应该如下所示:
for(aI = antiviral_data.begin(); aI != antiviral_data.end();)
{
for(vI = viral_data.begin(); vI != viral_data.end();)
{
...但是,正如Josh已经指出的,您的特定bug在第7行。
https://stackoverflow.com/questions/866776
复制相似问题