当我试图实现DBSCAN时,我遇到了一个问题,在Qt5应用程序中引发了一个中断。
因此,我打开调试器,试图找出可能导致问题的原因,它说我在作用域中有两个相同变量的副本,一个称为index
,另一个名为index <shadowed 1>
。我不明白如何在作用域中拥有index
变量的另一个副本?它们都有两个不同的值,其中没有<shadowed 1>
部分的值有指向内存访问错误位置的成员,所以我认为这就是正在使用的值。
QMap<int, Point*> kDistPlot;
for (int i = 0; i < points->size(); i++)
{
Point *point = points->at(i);
QMap<int, Point*> pointDistanceList;
for (int j = 0; j < points->size(); j++)
{
if (i == j)
continue;
Point *distPoint = points->at(j);
int dist = distance(point, distPoint);
Q_ASSERT_X(dist >= 0, __FUNCTION__, "Distance can't be negative...");
pointDistanceList.insert(dist, distPoint);
}
QMap<int, Point*>::const_iterator index = pointDistanceList.begin();
index += k - 1;
Point* kPoint = (*index); //this is where the error is
int kDist = index.key();
kDistPlot.insert(kDist, kPoint);
}
它在QMap类中触发了这个异常:
Stopped in thread 1 by: Exception at 0x581c79e8, code: 0xc0000005: read access violation at: 0x0, flags=0x0(first chance)
有人能解释一下吗?我完全弄糊涂了。
最终的问题是pointDistanceList QMap太短,因此向前移动索引超出了映射的末尾。QMap太短,因为使用insert
方法而不是insertMulti
方法时会覆盖重复键值。这是通过将*.insert(key, value
更改为*.insertMulti(key, value)
来纠正的。