“表达式:列表迭代器不兼容”在迭代过程中随机发生

时间:2015-03-01 14:36:35

标签: c++ list iterator std

我一直在尝试使用std :: list,但是我的工作遭到以下错误的破坏:

Debug Assertion Failed!

Program: C:\Windows\system32\MSVCP120D.dll
File: c:\program files (x86)\microsoft visual studio 12.0\vc\include\list
Line: 289

Expression: list iterators incompatible

For information on how your program can cause an assertion
failure, see the Visual C++ documentation on asserts.

(Press Retry to debug the application)

我已经搜索了一下(事实上几个小时),但没有解决我的问题。 错误在以下函数中显示:

void Plane::createFrame(){
    for( int i = 0; i < 400; i++ ){
        frame[i] = '_';
    }
    for (std::list<Unit>::iterator iterator = units_container.begin();
        iterator != units_container.end(); ++iterator) {

        iterator->draw(frame, 20);
    }
}

绘制函数的位置如下:

void Unit::draw( char(&world)[400], int width ){
    world[ position ] = avatar;     
}

另一个有趣的事情是我设法&#34;包含&#34;这个错误:

void Plane::createFrame(){
    for( int i = 0; i < 400; i++ ){
        frame[i] = '_';
    }
    for (std::list<Unit>::iterator iterator = units_container.begin();
        iterator != units_container.end(); ++iterator) {

        if( iterator->getPosition() < 0 ||
            iterator->getPosition() > 399 ){
            break;
        }
        iterator->draw(frame, 20);
    }
}

更改createFrame()似乎不受先前错误的影响。

如果我更改了我的代码同样的错误,我会在不同的地方发生(但是必须进行更改。现在它总是createFrame()显示错误)。它总是在几乎相同的for内显示,可能会调用不同的函数。

在循环中调用

createFrame()。错误通常在100圈后发生。已更改createFrame()随机使用break;,但错误从未显示。

没有其他线程可以访问列表。

我使用erase(),但错误似乎没有任何关联。

我希望我没有错过任何明显的东西,但现在我无法确定。 谢谢你的时间。

1 个答案:

答案 0 :(得分:1)

你有一个数组作为Unit::draw传递给char(&world)[400],你正在写入该数组的索引position

如果position不在0到399之间,则会导致未定义的行为。这可能会导致各种症状:您的代码可能会崩溃,可能无法正常工作,或者它可能会显示看似无关的错误消息,例如您获得的有关迭代器的消息。

当您添加position介于0和399之间的检查时,错误在此处停止。你说它现在发生在其他地方,所以你应该检查是否有任何越界数组访问(或任何其他类型的未定义行为)。最好确保position首先没有为{{1}}分配无效值。