【问题标题】:Debug assertion error - List iterators incompatible调试断言错误 - 列表迭代器不兼容
【发布时间】:2016-01-17 19:52:29
【问题描述】:

我正在开发一个程序,它应该将每个窗口放在一个列表中,调整它的大小,然后根据指定的布局将它移动到屏幕位置。

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

代码如下:

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;

【问题讨论】:

  • getWindowList() 请发布此功能。这个函数的返回值类型可能是原因。
  • 使用调试器找出这段代码的哪一行是断言的原因,这将有很大帮助。
  • 这就是我在评论中的意思:请在此答案中将std::vector 替换为std::liststackoverflow.com/questions/30041907/…——这有帮助吗?
  • 谢谢,您提供的链接解决了它,必须将 std::list Detector::getWindowList() 更改为 std::list & Detector::getWindowList()跨度>

标签: c++ list debugging for-loop syntax-error


【解决方案1】:

您的循环如下所示:

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

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

【讨论】:

    猜你喜欢
    • 2013-06-10
    • 2020-11-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-11
    • 1970-01-01
    相关资源
    最近更新 更多