2013-06-24 45 views
4

我想獲得一個C++程序,它可以在使用gcc進行編譯時正常工作,以在Visual C++上正常工作。我的問題是,我現在得到以下錯誤:Visual C++找到導致「調試斷言失敗」的行

Debug Assertion Failed! 

Program: C:\WINDOWS\SYSTEM32\MSVCP110D.dll 
File: c:\program files (x86)\microsoft visual studio 11.0\vc\include\vector 
Line: 1140 

Expression: vector subscript out of range 

我真正的問題是,我不知道何時何地發生這種情況。通過在錯誤窗口中按下中斷,我只被帶到最終發生異常的向量類的部分。我想在我的應用程序中找到實際引起它的地方。我已設法將它縮小到的代碼塊:

for(unsigned int i=0;i<openPolygonList.size();i++)//error somewhere in here 
    { 
     if (openPolygonList[i].size() < 1) continue; 
     for(unsigned int j=0;j<openPolygonList.size();j++) 
     { 
      if (openPolygonList[j].size() < 1) continue; 

      Point diff = openPolygonList[i][openPolygonList[i].size()-1] - openPolygonList[j][0]; 
      int64_t distSquared = vSize2(diff); 

      if (distSquared < 2 * 2) 
      { 
       if (i == j) 
       { 
        polygonList.push_back(openPolygonList[i]); 
        openPolygonList.erase(openPolygonList.begin() + i); 
       }else{ 
        for(unsigned int n=0; n<openPolygonList[j].size(); n++) 
         openPolygonList[i].push_back(openPolygonList[j][n]); 

        openPolygonList[j].clear(); 
       } 
      } 
     } 
    } 

在其中使用的矢量的每一行簡單地把brealpoints不是一種選擇,因爲循環迭代數千次不必按每次繼續將從字面上看,我花了數小時有什麼辦法可以告訴調試器在錯誤發生時在適當的線路上制動,以便我可以檢查變量並確定哪一個超出範圍?

+1

你應該嘗試使用callstack。查找你寫的第一個函數。 – JBL

+1

例如,你也可以告訴視覺只能在'i> something'後面打破。這是一個有條件的斷點。 –

+0

@JBL對不起,我對VC++很感興趣,你能向我解釋一下應該怎麼做? – Gerharddc

回答

3

我認爲問題在於你正在擦除你正在迭代的矢量的成員。如果你抹掉第一個元素會發生什麼?

I 1 2 3 榮V1 V2 V3

如果我們抹去1 i = 1時,我們的矢量索引和值低於現在我= 2

I 1 2 榮V2 V3

最終,我認爲你可以遍歷該向量的末尾,導致你有一個指向該向量末尾的指針。完成猜測工作在這裏,但可能有一個更簡單的方法來做你想做的事情。我無法弄清楚你想要做什麼。

它看起來像你試圖顛倒一個二維數組的行和列,同時將對角線多邊形存儲到一個新數組中。無論如何,是的,但是在for循環的開始處是一個紅色的圓圈,並逐行通過您的代碼。

我會創建臨時向量,然後修改for循環中的那些,然後替換向量openPolygonList。

3

調試器無法預測未來,但你可以告訴它打破所有例外,(ctrl + atl + e並勾選「Thrown」下的所有框)。當斷言發生時,將調用堆棧放到代碼中,它會告訴你哪一行導致了問題。

2

您可以打開調用堆棧窗口(Debug-> windows-> CallStack)並在程序中找到導致斷言的位置。 它應該在頂線以下2或3行。