C++ 声明双*数组时发生损坏的堆错误
我目前正在寻找两个矩阵的平方距离之和,数据保存在双*数组中。第一个索引保持不变,而另一个索引使用一个函数循环,该函数在两个索引之间返回一个32x32数组 但是,当我尝试在第一次递增“e”之后调用“getTile(d,e)”时,它会抛出一个堆损坏异常:C++ 声明双*数组时发生损坏的堆错误,c++,matrix,double,heap-corruption,C++,Matrix,Double,Heap Corruption,我目前正在寻找两个矩阵的平方距离之和,数据保存在双*数组中。第一个索引保持不变,而另一个索引使用一个函数循环,该函数在两个索引之间返回一个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[
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");
}
}
double*矩阵::ssd(整数i、整数j、矩阵和rhs){
双和=0,val=0;int g=0,h=0;
double*bestMatch=newdouble[32*32];double*sameTile=newdouble[32*32];double*changeTile=newdouble[32*32];
对于(intx=i-32;x,代码中有一系列问题都与不正确地访问数组元素有关
在第一个循环中,行:
sameTile[g*32+h] = data[x*N+y];
changeTile = rhs.getTile(d, e);
至少是数据数组的下溢。考虑如果i=0,j=0,n=512,那么您试图在循环的第一遍中访问数据[-16416 ]。< /P>
第二个问题是getTile()方法,在该方法中,您忘记在内部循环结束时将
h
重置为0(就像您在ssd()方法中所做的那样)。这会导致tile[]溢出
我还要再次检查线路:
sameTile[g*32+h] = data[x*N+y];
changeTile = rhs.getTile(d, e);
方法getTile()以确保数据[]上不会发生数组溢出
总的来说,我建议尽可能使用适当的std::容器。正确使用它们应该完全消除此类错误。如果确实需要使用原始指针/数组,那么除了在需要时进行边界检查外,还需要确保对它们的所有索引都尽可能清晰。什么是N,什么是输入i和j输入到ssd()方法?数据[]的定义/大小也会有帮助。tile
似乎是return
ed fromgetTile()
没有写入任何数据。这是故意的吗?如果你坚持每行一条语句,而不是像double*tile=new double[32*32];int g=0;int h=0;
那么所有这些new double[32*32]那样把它们挤进去,你的代码会更清晰
s正在delete
d?您是否考虑过智能指针或任何std:
容器?double*
s不是“数组”,它们是指针,应该被视为数组。@uesp N是x轴的大小,在本例中为512。数据使用N和M声明,如:double*data=new double[M*N];输入i和j指定了32x32磁贴的位置,该磁贴正在针对rhs矩阵中的每个磁贴进行测试。您在更正的程序中还存在错误吗?嘿@uesp,感谢您的回复。您必须原谅代码中的零碎部分,很多代码需要改进,只是为了得到一个工作程序。您提到的第一个循环为我省去了一些麻烦,我假设输入的值永远不会低于32。问题肯定出在changeTile=rhs.getTile(d,e)行中;由于返回的数据不在正确的位置,它似乎在每个第32个索引值处输入每个元素。再次感谢您的响应:>