【发布时间】:2019-03-31 17:59:23
【问题描述】:
我有一个为 3d 数组分配内存的函数。目标是保证内存是连续的,同时又具有a[k][j][i]语法的便利性:
double *** allocate_3d(const int& sz, const int& sy, const int& sx){
double * aMem = new double[sz*sy*sx];
double *** array = new double**[sz];
for(int k=0; k<sz; k++){
array[k] = new double*[sy];
for(int j=0; j<sy; j++){
array[k][j]= aMem + k*sy*sx + j*sx;
}
}
return array;
}
假设我这样调用函数
x = allocate_3d(wdz,wdy,wdx);
如何正确释放 x?我尝试了以下方法:
void delete_3d(double *** array, const int& sz, const int& sy, const int& sx){
for(int k=0; k<sz; k++){
for(int j=0; j<sy; j++){
delete[] array[k][j];
}
delete[] array[k];
}
delete[] array;
}
但运行 Valgrind 会报错,似乎表明内存没有正确释放。
【问题讨论】:
-
避免整个头痛,并使用
std::vector为您分配和正确释放所有内存。上面写的任何内容都不需要明确的new和delete。矢量将为您做一切。这就是向量的用途。 -
我可能是错的,但如果我使用向量的向量的向量,我认为我无法获得语法
a[k][j][i]并且具有连续的内存。 -
上面的每个动态分配的对象都可以替换为等效的向量。
aMem和array都可以只是向量。结束。 -
一个向量保证连续的内存。
-
@EternusVia
array[0][0]给你aMem。
标签: c++ multidimensional-array memory-management new-operator delete-operator