【问题标题】:Where is this code dereferencing an invalid iterator? (C++)这段代码在哪里取消引用无效的迭代器? (C++)
【发布时间】:2009-05-16 03:04:58
【问题描述】:

我有一个循环

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++;
            aI++;
        }
    }
}

但是当 antiviral_data 包含一个项目时,我会收到一个错误“vector iterator not dereferencable”。为什么会出现此错误,我在哪里取消引用无效的迭代器?

注意:到目前为止,仅当 if() 语句为假时才会发生错误。我不知道如果 if() 语句为真会发生什么。

【问题讨论】:

    标签: c++ vector iterator


    【解决方案1】:

    向量的大小是多少?

    如果viral_data 比antiviral_data 有更多的元素,那么,由于你以相同的速率递增aI 和vI,aI 会在vI 循环结束之前超出界限。

    在这里举一个简短的例子:

    for(int i = 0; i < 5;)
    {
        for(int j = 0; j < 10;)
        {
            i++;
            j++;
        }
    }
    

    如果您检查 for 循环,您会注意到内部循环不会结束,直到 j i 都为 10,但根据您的外部循环,我应该 超过 5 个。

    您需要像这样在外部循环中增加 i(或在您的情况下为 aI):

    for(int i = 0; i < 5;)
    {
        for(int j = 0; j < 10;)
        {
            j++;
        }
        i++;
    }
    

    【讨论】:

    • vI 总是 2,aI 从 0 开始。谢谢
    【解决方案2】:

    取消引用发生在

    ((*aI)->x == (*vI)->x && (*aI)->y == (*vI)->y)
    

    当该语句对于antiviral_data 列表中的最后一个元素为真时,它就会发生。在这种情况下,在内部 for 循环的下一次迭代中,您将取消对 antiviral_data.end() 的引用,这是不允许的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-03
      • 2019-12-24
      • 1970-01-01
      • 2020-08-25
      • 1970-01-01
      • 2015-07-03
      相关资源
      最近更新 更多