0

複素数の 2D 配列/行列があります。この 2D 配列の行を 1D 配列にコピーします。x86_64-suse-linux で複雑なライブラリと gcc バージョン 4.5.1 を使用しています。new を使用して配列を動的に割り当てます。memcpy を使用して、2D 行列の配列を 1D 配列に転送します。それはうまく動作します。問題は、アレイを削除するとクラッシュすることです。なぜなのか、何なのかわかりません。valgrind を使用してデバッグすると (私は専門家ではありません)、次のメッセージが表示されます。

==20516== Invalid free() / delete / delete[]
==20516==    at 0x4C24F6E: operator delete[](void*) (in /usr/lib64/valgrind/vgpreload_memcheck-amd64-linux.so)
==20516==    by 0x400BBC: main (complex.cpp:29)
==20516==  Address 0x590f290 is 0 bytes inside a block of size 160 free'd
==20516==    at 0x4C24F6E: operator delete[](void*) (in /usr/lib64/valgrind/vgpreload_memcheck-amd64-linux.so)
==20516==    by 0x400B86: main (complex.cpp:27)

以下にコード全体を掲載します。

#include<iostream>
#include<stdlib.h>
#include<string.h>
#include<algorithm>
#include<complex>
using namespace std;

int main(){
complex<double> **array = new complex<double>*[10];
for (int i=0; i<10; i++) array[i]=new complex<double>[10];

for (int i=0; i<10; i++){
        for (int j=0; j<10; j++){
                array[i][j]=complex<double> (i,j+1); abs(array[i][j]) << "]" << endl;
        }
}

complex<double>* b = new complex<double>[10];
memcpy(&b,&array[2],sizeof(array));
for (int i=0; i<10; i++){
        cout << array[2][i] << "\t" << b[i] << endl;
}

delete[] b;
for (int i = 0 ; i < 10 ; i++){
        delete[] array[i];
}
delete[] array;

}

このエラーを回避するために、配列「array」を「b」にコピーする他の高速な方法はありますか? 複雑な配列の代わりに double 配列のみを使用する場合。この問題は観察されません。また、複雑な配列の動的割り当てに問題がありますか? 過去に新規/削除を使用しているときに、複雑な配列の動的割り当てに関連する問題があったことを覚えているようです。しかし、静的割り当てによってなんとか克服できたと思います。複雑な配列を動的に割り当てる方法を変更する必要がありますか?

4

2 に答える 2