C++ 我一直得到这个调试断言失败?表达式:列表迭代器不可取消引用

C++ 我一直得到这个调试断言失败?表达式:列表迭代器不可取消引用,c++,C++,我从以下代码中得到一个断言失败“列表迭代器不可取消引用”: 上面说是最后一行的 void cpuschedule::Sjf() { int CT = 0; bool IO = false; Data temp; for(it = lPro.begin(); it != lPro.end(); ++it) { if(it->RQ) { temp.AT = it->AT;

我从以下代码中得到一个断言失败“列表迭代器不可取消引用”:

上面说是最后一行的

void cpuschedule::Sjf()
{
    int CT = 0;
    bool IO = false;
    Data temp;

    for(it = lPro.begin(); it != lPro.end(); ++it)
    {
        if(it->RQ)
        {
            temp.AT = it->AT;
            temp.BUT = it->BUT;
            temp.BUP = it->BUP;
            temp.IOP = it->IOP;
            temp.IOT = it->IOT;
            temp.ProNum = it->ProNum;
            temp.RQ = it->RQ;
            temp.vData = it->vData;
            Ready.push_back(temp);
        }
    }    

    it2 = Ready.begin();

    while(!(Ready.empty()))
    {

        if(IO)
        {
            for(iR = Ready.begin(); iR != Ready.end(); ++iR)
            {
                if(!(iR->RQ))
                {
                    (iR->IOT)--;
                    if(iR->IOT == 0)
                    {
                        iR->BUP += 2;
                        iR->IOP += 2;
                        iR->BUT = iR->vData[(iR->BUP)];
                        iR->IOT = iR->vData[(iR->IOP)];

                        iR->RQ = true;
                        iR->AT = CT;
                    }

                    if(iR->IOT == -121)//Check for the end of the Vector
                    {
                        temp.AT = iR->AT;
                        temp.BUT = iR->BUT;
                        temp.BUP = iR->BUP;
                        temp.IOP = iR->IOP;
                        temp.IOT = iR->IOT;
                        temp.ProNum = iR->ProNum;
                        temp.RQ = iR->RQ;
                        temp.vData = iR->vData;
                        Out.push_back(temp);//Instert to the List of Done

                        iR = Ready.erase(iR);
                    }
                }
            }
        }

        Ready.sort(comp);

        if((it2->BUT != 0) && (it2->RQ))
        {
            it2->BUT--;

            if(it2->BUT == 0)
            {

                printState(CT);

                it2->RQ = false;
                IO = true;

                if(next(it2) == Ready.end())
                {

                    it2 = Ready.begin();

                }
                else
                    ++it2;
            }
        }

    CT++;
    }

}
这是CPU调度SJF的while循环。
它上升到691,应该执行901个循环

您的循环执行
iR=Ready.erase(iR)然后执行
iR++
。如果被擦除的元素是最后一个,则这是错误的;你一个接一个

常见的成语是:

for ( ; iR != end; ) { // <-- NO iR++
   if (condition_to_erase)
      iR = Ready.erase(iR);
   else
      iR++;
}

for(;iR!=end;){//这是一大块代码,我看不出您已经指出崩溃发生在哪一行,但是-您应该检查您正在使用的容器的迭代器
it2
erase()
sort()之后是否仍然有效
操作。将
it2
的声明向下移动到使用前,这可能是更好的风格。你的
it
lPro
看起来怎么样?你能告诉我们你在哪里声明的吗?我相信大部分代码都不需要重现问题。发布一个显示p问题。