繁体   English   中英

调试断言错误 - 列表迭代器不兼容

[英]Debug assertion error - List iterators incompatible

我正在开发一个程序,该程序应该将每个 Window 放入列表中,调整其大小,然后根据指定的布局将其移动到屏幕 position 上。

当我运行这个 function 但是我得到一个调试断言错误,说“列表迭代器不兼容”。

这是代码:

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 function:

std::list <Window> Detector::getWindowList()
{
    return windowList;
}

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

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

仅供研究此问题的其他人使用,您在处理悬空指针并删除 memory 时也会收到相同的错误消息。 我在追踪该错误消息时遇到了这个线程。 就我而言,有一个迭代器指向已被删除的列表。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM