Driver::~Driver()
{
    AutoCritSec acsDriverList(m_csDriverList,true);
    DRIVERLIST::iterator it = m_DriverList.begin();
    for(;it!=m_DriverList.end();it++)
    {
        if (it->second == this)
        {
            m_DriverList.erase(it);
            it = m_DriverList.begin();
        }
    }
}

当我在Visual Studio 2003中编译程序时,程序运行良好。但是当我在2010年做同样的事情时,在关闭应用程序时却出现了一些错误,例如
Expression:map/set iterator not incrementable

当我按忽略它时,我得到
Expression:"standard c++ library out of range" && 0

是否有人知道这里发生了什么:我将非常感谢任何人的任何建议。表示感谢和热情的祝福。

最佳答案

如果this是列表中的唯一元素,则将超出列表的末尾。

从列表中删除this后,您将重置it = m_DriverList.begin();。这可以。然后评估循环表达式(i++语句中的for),这会使it超出范围的末尾。

将迭代器前进到容器的末尾会导致程序显示未定义的行为。 Visual C++的最新版本可以在程序的调试版本中帮助检测许多常见的迭代器错误,并提出断言来帮助您解决问题。

您可以通过删除循环表达式并将其移到else语句中来解决该问题:

while (it != m_DriverList.end())
{
    if (it->second == this)
    {
        m_DriverList.erase(it);
        it = m_DriverList.begin();
    }
    else
    {
        ++it;
    }
}

但是,每次删除元素时重新启动迭代都是相当浪费的。考虑改为使用erase调用返回的迭代器:
it = m_DriverList.erase(it);

关于c++ - 映射/设置迭代器不可递增映射/设置迭代器不可递增,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/8997503/

10-17 00:37