我需要在堆上存储一个数组,因为它在运行程序时遇到了一个seg错误,因为它太大了。通常这很容易,但在这种情况下它是一个多维数组(具体是3D),它也是一个可变长度的数组。
我试图将这个答案放在一个二维阵列上(我非常肯定有效,因为我在SO上的另一个答案中找到它)到一个3D阵列
int **ary = new int*[sizeY];
for(int i = 0; i < sizeY; ++i) {
ary[i] = new int[sizeX];
}
通过这样做:
double **isoarray = new double*[nBinsX];
for(int xi = 0; xi < nBinsX; ++xi){
isoarray[xi] = new double[nBinsY];
for(int yi = 0; yi < nBinsY; ++yi){
isoarray[xi][yi] = new double[nShuffles];
}
}
我应该提到的是,数组的大小是nBinsX x nBinsY x nShuffles,但它不起作用,我也不认为它是诚实的。任何人都可以提出如何做到这一点的建议吗?提前谢谢!
答案 0 :(得分:0)
不是堆指向更多堆分配的数组的指针数组等,而是应该进行单个巨型分配并进行适当的索引。这是一种常见的技术:
double *isoarray = new double[nBinsX * nBinsY * nShuffles];
如果你想用它制作一个不错的C ++解决方案,那么将该指针存储在一个具有索引方法的类中:
double& at(x, y, shuffle) {
return isoarray[x * nBinsY * nShuffles + y * nShuffles + shuffle];
}
这样,您可以使用单个连续分配,这在分配,使用和解除分配时更有效。你可以根据哪个维度和#34;第一个&#34;来玩索引。根据您通常遍历数据的方式来获得更好的性能。