我想知道在 C++ 中为 4-D 数组分配动态内存的最简单当然也是最准确的方法是什么。我已经知道的是:
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];
}
}
}
声明A
为维度为s1
x s2
x s3
x的 4-D 数组s4
。
但是,上述方法并不安全。从某种意义上说,如果其中一个new
s 未能分配内存,则循环会继续,而不会注意到这一点。
为了使上面的内容更安全一点,我们可以将它包含在try
/块中,这样代码在 a被抛出catch
后不会继续,并且代码不会尝试访问一些不存在的内存元素,并且程序可以在此停止观点。bad_alloc
new
这是可以的,只是已经分配的内存在程序完成之前不会被释放。从理论上讲i
,我们必须能够准确地说出哪些内存元素已经分配并释放它们j
。k
但我想不出一个直接的方法来做到这一点。
对于二维情况,我会做这样的事情:
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