"Expression: list iterators incompatible" 在遍历列表期间随机发生
"Expression: list iterators incompatible" happening randomly during iteration through a list
我一直在尝试使用 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;
}
另一件有趣的事情是我设法 "contain" 这个错误:
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()
,但错误似乎没有任何关联。
我希望我没有遗漏任何明显的东西,但现在我真的不能确定。
感谢您的宝贵时间。
您有一个数组作为 char(&world)[400]
传递给 Unit::draw
,并且您正在写入该数组的索引 position
。
如果 position
不在 0 到 399 之间,这将导致未定义的行为。这可能会导致各种症状:您的代码可能会崩溃,可能无法正常工作,或者可能会显示看似无关的错误消息,例如您收到的有关迭代器的错误消息。
当您添加 position
介于 0 和 399 之间的检查时,此处不再发生错误。你说它现在发生在其他地方,所以你应该检查那里是否有任何越界数组访问(或任何其他类型的未定义行为)。最好首先确保 position
不会被分配无效值。
我一直在尝试使用 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;
}
另一件有趣的事情是我设法 "contain" 这个错误:
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()
,但错误似乎没有任何关联。
我希望我没有遗漏任何明显的东西,但现在我真的不能确定。 感谢您的宝贵时间。
您有一个数组作为 char(&world)[400]
传递给 Unit::draw
,并且您正在写入该数组的索引 position
。
如果 position
不在 0 到 399 之间,这将导致未定义的行为。这可能会导致各种症状:您的代码可能会崩溃,可能无法正常工作,或者可能会显示看似无关的错误消息,例如您收到的有关迭代器的错误消息。
当您添加 position
介于 0 和 399 之间的检查时,此处不再发生错误。你说它现在发生在其他地方,所以你应该检查那里是否有任何越界数组访问(或任何其他类型的未定义行为)。最好首先确保 position
不会被分配无效值。