C++ 声明双*数组时发生损坏的堆错误

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[

我目前正在寻找两个矩阵的平方距离之和,数据保存在双*数组中。第一个索引保持不变,而另一个索引使用一个函数循环,该函数在两个索引之间返回一个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");
    }   
}
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 from
getTile()
没有写入任何数据。这是故意的吗?如果你坚持每行一条语句,而不是像
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个索引值处输入每个元素。再次感谢您的响应:>