我有一个三维空间X-Y-Z离散成细胞。每个细胞都有一定的密度值。我希望能够将密度值存储在3-D数组中,以便我可以通过索引来调用它们,即
density_ijk = x[i][j][k];
我有以下类定义:
class A {
public:
A(int a, int b, int c);
private:
double ***x;
}
A::A(int a, int b, int c){
x = new double**[a];
for(int i=0;i<a;i++){
x[i] = new double*[b];
for(int j=0;j<b;j++){
x[i][j] = new double[c];
}
}
}
它构建成功,但是在运行时生成EXC_BAD_ACCESS(code=1, address=0x0)
。
我的代码中是否有悬空指针?我能做错什么?
我的主要是:
int main(int argc, const char * argv[]) {
int numX=100, numY=100, numZ=10;
A testImplementation(numX, numY, numZ);
return 0;
}
来源1:https://www.codeproject.com/Articles/83080/Dynamic-Three-Dimensional-Arrays-in-C-C-C-Java 来源2:http://www.cplusplus.com/forum/general/24347/
谢谢!
答案 0 :(得分:4)
不要使用拥有原始指针
class A {
public:
A(std::size_t a, std::size_t b, std::size_t c);
private:
std::vector<std::vector<std::vector<double>>> x;
}
A::A(std::size_t a, std::size_t b, std::size_t c)
: x(a, std::vector<std::vector<double>>(b, std::vector<double>(c, 0.))) {}
如果您想首先使用a
,b
和c
,请编写一种方法来执行此操作。
class A {
public:
A(std::size_t a, std::size_t b, std::size_t c);
private:
std::vector<std::vector<std::vector<double>>> x;
std::vector<std::vector<std::vector<double>>> fiddle_input(std::size_t a, std::size_t b, std::size_t c);
}
A::A(std::size_t a, std::size_t b, std::size_t c) : x(fiddle_input(a, b, c)) {}
std::vector<std::vector<std::vector<double>>> A::fiddle_input(std::size_t a, std::size_t b, std::size_t c) {
/*Some implementation*/
return {new_a, {new_b, {new_c, 0.}}};
}
允许编译器(并且发布c ++ 17 必需)仅构造一个带有此值的3d向量。