调试断言错误 - 列出不兼容的迭代器
Debug assertion error - List iterators incompatible
我正在开发一个程序,该程序应该将每个窗口放在列表中,调整其大小,并根据指定的布局将其移动到屏幕位置。
但是,当我运行此函数时,我收到一个调试断言错误,指出"列出迭代器不兼容"。
这是代码:
void Control::checkForNewWindows()
{
for (std::list<Window>::iterator i = mainDetector.getWindowList().begin(); i != mainDetector.getWindowList().end(); ++i)
{
bool forBreak = false;
if ((i->getTitle().find("sample_title") != std::string::npos) && (i->getState() == false))
{
for (int y = 0; y < 3; y++)
{
for (int x = 0; x < 4; x++)
{
if (activeLayout.windowLayout[y][x].getHandle() == 0)
{
moveWindow(*i, activeLayout.dimensionsLayout[y][x].x, activeLayout.dimensionsLayout[y][x].y, activeLayout.dimensionsLayout[y][x].width,
activeLayout.dimensionsLayout[y][x].height);
activeLayout.windowLayout[y][x] = *i;
activeLayout.windowLayout[y][x].setState(true);
forBreak = true;
}
if (forBreak)
{
break;
}
}
if (forBreak)
{
break;
}
}
}
}
}
错误发生在第一个for循环期间,希望有人可以帮助我解决这个问题
编辑:
下面是 getWindowList 函数:
std::list <Window> Detector::getWindowList()
{
return windowList;
}
和窗口列表定义:
std::list <Window> windowList;
您的循环如下所示:
for (std::list<Window>::iterator i = mainDetector.getWindowList().begin();
i != mainDetector.getWindowList().end();
++i)
鉴于上述情况,问题是这样的:
std::list <Window> Detector::getWindowList()
{
return windowList;
}
您返回的是列表的副本,而不是原始列表。 因此,副本的迭代器将在循环中使用,而不是windowList
的迭代器。 实际上,您在循环构造中使用了两个不同的迭代器,它们都不引用原始列表,仅引用副本。
解决方法是返回引用:
std::list <Window>& Detector::getWindowList()
{
return windowList;
}
您现在返回的是对实际列表的引用,而不是副本。 现在,您在循环约束中使用的迭代器引用相同的列表,而不是不同的列表。
仅供参考 对于其他研究此问题的人,在处理悬空指针和已删除内存时,您也可以收到相同的错误消息。我在追踪该错误消息时遇到了这个线程。就我而言,有一个已删除列表的迭代器。
相关文章:
- 不明白迭代器,引用和指针失效,一个例子
- 自定义 STL 兼容迭代器,用于迭代 2D 数组类的列
- 为什么某些 STL 容器(堆栈、队列、优先级队列)不支持迭代器?
- 为什么 min_element() 返回最小元素的索引,而不是迭代器?
- 我从 std::set 得到const_iterator而不是迭代器
- 为什么向量的.at()成员函数返回引用而不是迭代器
- 如果我有一个指向矢量元素的指针,而不是迭代器,如何删除它?
- 对于使用 C 样式指针矢量化的循环,但不使用迭代器
- 使用循环(而不是迭代器)从向量中删除指针
- 将指针而不是迭代器传递到std ::复制
- 如何在不使用迭代器的情况下在 C++ 中打印地图
- C++模板不接受迭代器
- 容器不可知迭代器参数
- 为什么 void* 不是迭代器类型?
- 如何在不使用迭代器的情况下访问任何向量的第 i 个元素
- 为什么在达到容量后在向量中插入时,C++不处理迭代器?
- 我可以用cout而不是迭代器循环打印STL映射吗?
- 为什么 std::bitset 不附带迭代器?
- 字符串::擦除不接受迭代器?
- 是否有一个标准容器允许在不使迭代器无效的情况下插入元素