1

私は現在、2 つのマトリックスの二乗距離の合計を求める作業を行っています。データは double* 配列に保持されています。それらの最初のものは同じままですが、もう一方は 2 つのインデックス間の 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* でのメモリの割り当てでエラーが発生すると思いますか?

どんな助けでも大歓迎です。

4

1 に答える 1

3

コードには、配列要素への不適切なアクセスに関連する問題がたくさんあります。

最初のループで次の行を実行します。

 sameTile[g*32+h] = data[x*N+y];

少なくともデータ配列をアンダーフローします。i=0、j=0、N=512 の場合、ループの最初のパスで data[-16416] にアクセスしようとしています。

h2 番目の問題は、 (ssd() メソッドで行うように) 内部ループの最後で 0にリセットするのを忘れる getTile() メソッドです。これにより、 tile[] のオーバーフローが発生します

また、次の行を再確認します。

 changeTile = rhs.getTile(d, e);

また、data[] で配列のオーバーフローが発生しないようにする getTile() メソッド。

全体として、可能であれば適切な std:: コンテナを使用することをお勧めします。それらを正しく使用すると、この種のエラーを完全に排除できます。生のポインター/配列を本当に使用する必要がある場合は、必要に応じて境界チェックに加えて、それらへのすべてのインデックス付けが可能な限り明確であることを確認する必要があります。

于 2012-04-25T02:14:19.840 に答える