我正在尝试使用gcc编译时可以正常工作的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
我真正的问题是我不知道何时或何地发生这种情况。通过在错误窗口中按下break,我只会被带到最终发生异常的vector类的部分。我想在我的应用程序中找到实际引起它的地方。我设法将其缩小到这段代码:
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();
}
}
}
}
简单地在每个使用向量的行放置断点不是一个选项,因为循环迭代数千次并且每次按下继续将花费我几个小时。一旦发生错误,有什么办法可以告诉调试器在适当的线路上制动。它可以帮助我检查变量并确定哪个变量超出范围?
答案 0 :(得分:3)
调试器无法预测未来,但您可以告诉它打破所有异常,(ctrl + atl + e并勾选“Thrown”下的所有框)。当断言发生时,将调用堆栈向下移动到您的代码,它将告诉您导致问题的是哪一行。
答案 1 :(得分:3)
我认为问题在于您正在删除正在迭代的向量的成员。如果删除第一个元素会发生什么?
i 1 2 3 Ei v1 v2 v3
如果我们在i = 1时擦除1,我们的矢量索引和值低于,现在i = 2。
我1 2 Ei v2 v3
最终,我认为你可以遍历向量的末尾,导致你有一个指向越过向量末尾的指针。完成猜测工作,但可能有一种更简单的方法来做你想做的事情。我无法弄清楚你想要做什么。
看起来你正试图反转二维数组的行和列,同时将数组中的对角线多边形存储到一个新数组中。无论如何,是的,但是在for循环的开头有一个红色圆圈,逐行遍历你的代码。
我会创建临时向量,然后在for循环中修改那些向量,然后替换向量openPolygonList。
答案 2 :(得分:2)
您可以打开调用堆栈窗口(Debug-&gt; windows-&gt; CallStack)并在程序中找到导致断言的位置。 它应该在顶行下方2或3行。