3D数组c ++的动态初始化

时间:2017-06-07 12:45:14

标签: c++ arrays

我有一个三维空间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/

谢谢!

1 个答案:

答案 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.))) {}

如果您想首先使用abc,请编写一种方法来执行此操作。

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向量。