1

我创建了一个程序,它使用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++;
        }
    }
4

5 回答 5

10

运行时检测到您正在取消引用 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

您正在取消引用越界迭代器。

修复方法是aI != antiviral_data.end()在擦除调用之后检查,以确保在继续使用它之前没有碰到向量的末尾。

于 2009-05-15T02:47:20.813 回答
7

你真的想看看 STL 算法,remove_if而不是手动做这些事情。

于 2009-05-15T03:03:01.667 回答
5

一个小的一般性评论:在检查迭代器时end(),不要使用“ <”,而只能使用“ !=”。因此,代码的第一行应如下所示:

for(aI = antiviral_data.begin(); aI != antiviral_data.end();)
{
  for(vI = viral_data.begin(); vI != viral_data.end();)
  {
    ...

但是,正如 Josh 已经指出的那样,您的特定错误在第 7 行。

于 2009-05-15T03:22:32.867 回答
1

除了接受的答案之外,并详细说明 slavy13 的答案 -
编辑- 正如 Josh 所提到的,与这个问题没有直接关系 - 我把它留在这里供参考)。

代码(但不是此代码)有时假定您可以从向量中删除元素并继续迭代。这是一个错误的假设——一旦你从向量中删除了一个元素,被删除元素之后的所有其他迭代器都将失效——你不能再假设它们是正确的,如果你继续使用它们,“坏事”就会发生。

这样做的原因是因为向量实际上以数组形式存储信息。当一个元素被删除时,所有后续元素都被向下复制一个单元格。迭代器不会相应地更新。

强烈建议在尝试执行此类操作时查阅 STL 文档,因为完全有可能此类代码会意外地在 STL 的某个实现上运行,但在其他实现上会失败。

于 2009-05-15T04:07:24.727 回答
-2

擦除向量中的元素会使所有迭代器无效。

于 2009-05-15T03:37:14.907 回答