2013-10-23 52 views
0

我從下面的代碼中收到斷言失敗「列表迭代器不可取消」:我不斷收到此調試斷言失敗?表達式:列表迭代器不可解引用

它說它是從最後一行開始的。

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循環

+0

這就是代碼了一大截,我無法看到你已指示該行飛機墜毀,但是 - 你也許應該檢查迭代器'it2'因爲你使用的容器在'erase()'和'sort()'操作後仍然有效。將「it2」的聲明下移到使用前,這可能是更好的風格。 –

+0

你的'it'和'lPro'是怎麼樣的?你能告訴我們你在哪裏申報了嗎? – mihai

+0

我相信大部分代碼不需要重現該問題。發佈展示該問題的較小版本。 –

回答

2

您的循環執行iR = Ready.erase(iR);然後iR++無論如何。這是錯誤的,如果刪除的元素是最後一個;你去一個完整的。

常見的成語是:

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