debugging 调试Assert错误-列表迭代器不兼容

ctehm74n  于 2022-11-14  发布在  其他
关注(0)|答案(2)|浏览(141)

我正在开发一个程序,它应该把每个窗口放在一个列表中,调整它的大小,并根据指定的布局将它移动到屏幕位置。
然而,当我运行这个函数时,我得到了一个调试Assert错误,显示“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;
}

和windowList定义:

std::list <Window> windowList;
3gtaxfhh

3gtaxfhh1#

循环如下所示:

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

现在返回的是对实际列表的引用,而不是副本。现在循环约束中使用的迭代器引用的是同一个列表,而不是不同的列表。

gijlo24d

gijlo24d2#

对于其他研究这一点的人来说,当处理悬空指针和删除内存时,你也会得到同样的错误消息。我在跟踪这个错误消息时遇到了这个线程。在我的例子中,有一个迭代器指向一个已经被删除的列表。

相关问题