我目前正致力于寻找两个基质的平方距离之和,数据保存在双*数组中。第一个保持不变,而另一个循环使用一个函数,在两个索引之间返回一个32x32数组。
然而,当我尝试在第一次增加“e”之后调用“getTile(d,e)”时,它会引发堆损坏异常:
double* Matrix::ssd(int i, int j, Matrix& rhs){
double sum = 0, val = 0; int g = 0, h=0;
double* bestMatch = new double[32*32]; double* sameTile = new double[32*32]; double* changeTile = new double[32*32];
for(int x = i-32; x <i; x++){
for(int y = j-32; y <j; y++){
sameTile[g*32+h] = data[x*N+y];
h++;
}g++; h = 0;
}
system("pause");
for(int d = 32; d<=512; d+=32){
for(int e = 32; e<=512; e+=32){
changeTile = rhs.getTile(d,e);
for(int out = 0; out < 32; out++){
for(int in = 0; in < 32; in++){
val = sameTile[out*32+in] - changeTile[out*32+in];
val = val*val;
sum = sum + val;
}
}
cout << sum << endl;
sum = 0; val = 0;
system("pause");
}
}
getTile(int i,int j)函数:
double* Matrix::getTile(int i, int j){
double* tile = new double[32*32]; int g = 0; int h = 0;
for(int x=i-32; x<i; x++){
for(int y=j-32; y<j; y++){
tile[g*32+h] = data[x*N+y];
h++;
}
cout << endl;
g++;
}
return tile;
}
我相信在changeTile double *?
中分配内存时会出现错误非常感谢任何帮助。
答案 0 :(得分:3)
您的代码中存在许多与不正确访问数组元素相关的问题。
在第一个循环中,行:
sameTile[g*32+h] = data[x*N+y];
至少会使数据下溢。考虑如果i = 0,j = 0,并且N = 512,那么您试图在循环的第一遍中访问数据[-16416]。
第二个问题是getTile()方法,在内部循环结束时忘记将h
重置为0(就像在ssd()方法中那样)。这会导致tile []
我还要仔细检查一下:
changeTile = rhs.getTile(d, e);
和方法getTile()以确保数据[]上不会发生数组溢出。
总的来说,如果可能的话,我建议使用正确的std :: containers。正确使用它们应该完全消除这种类型的错误。如果你真的需要使用原始指针/数组,那么你需要确保除了在需要的边界检查之外,所有索引都尽可能清晰。