C++ で 4 次元配列の動的メモリ割り当てを行う最も簡単で、もちろん最も正確な方法は何かと考えていました。私がすでに知っていることは次のとおりです。
double**** A;
A = new double***[s1];
for (i = 0; i < s1; i++) {
A[i] = new double**[s2];
for (j = 0; j < s2; j++) {
A[i][j] = new double*[s3];
for (k = 0; k < s3; k++) {
A[i][j][k] = new double[s4];
}
}
}
次元x x xA
の 4 次元配列として宣言します。s1
s2
s3
s4
ただし、上記は安全ではありません。new
の 1 つがメモリの割り当てに失敗した場合、これに気付かずにループが継続するという意味で。
try
上記を少し安全にするために、 /catch
ブロックで囲むことができます。これにより、bad_alloc
がスローされた後にコードが続行されnew
ず、コードが存在しないメモリ要素にアクセスしようとせず、プログラムがこれで停止する可能性があります。点。
これは問題ありませんが、既に割り当てられているメモリはプログラムが終了する前に解放されません。i
、j
、およびの値を使用して、理論的には、k
どのメモリ要素が既に割り当てられているかを正確に判断して解放できる必要があります。しかし、私はそれを行う簡単な方法を考えることはできません。
2 次元の場合、次のようにします。
double** A;
try {
A = new double*[s1];
} catch(bad_alloc& ba) {
delete[] A;
throw ba; // or end the program
}
try {
for (i = 0; i < s1; i++)
A[i] = new double[s2];
} catch(bad_alloc& ba) {
while(--i) {
delete[] A[i];
}
delete[] A;
throw ba; // or end the prog.
}
上記は、より高次元の配列に一般化できますが、非常に見苦しいと思います! だから、それを行うためのより良い方法があるのだろうか?
私の場合A[i][j][k]
、ゼロ以外の要素がほとんどないベクトルであることにも言及する必要があると思います。したがって、s3
ゼロ以外の要素の数と同じ大きさにするだけです(そして、インデックスのマッピングを処理します...後で)。s3
ただし、 によって異なりますj
。そのため、従来のメモリ割り当てを使用する方が、次のような高レベル API よりも簡単です。vector