初始化到多维数组的动态指针的正确方法?

Jad*_*era 26 c++ pointers dynamic multidimensional-array c++11

当我将它们调整到2维或更高时,我一直在使用动态指针运气不好.例如,我想要一个指向2D数组的指针.我知道:

int A[3][4];
int (*P)[4] = A;
Run Code Online (Sandbox Code Playgroud)

是完全合法的(即使我不完全理解为什么).考虑到:

int *P = new int[4];
Run Code Online (Sandbox Code Playgroud)

工作,我想象:

int **P = new int[5][7];
Run Code Online (Sandbox Code Playgroud)

也会有效,但事实并非如此.此代码说明错误:

Error: A value of type "(*)[7]" cannot be used to initialize an entity of
       type "int **"
Run Code Online (Sandbox Code Playgroud)

看到这个,新的部分变成了一个指向我所做的7个整数数组的指针:

int (*P)[4] = new int[7][4];
Run Code Online (Sandbox Code Playgroud)

这确实有效,但这不是我想要完成的.通过这样做我至少限制为任何后续维度使用常量值,但我希望它在运行时完全定义,因此"动态".

我怎么能去使这个多维指针工作?

Dip*_*ole 68

让我们从一些基本的例子开始.

当你说 int *P = new int[4];

  1. new int[4]; 调用operator new函数()
  2. 为4个整数分配一个内存.
  3. 返回对此内存的引用.
  4. 要绑定此引用,您需要具有与返回引用相同类型的指针,以便执行此操作

    int *P = new int[4]; // As you created an array of integer
                         // you should assign it to a pointer-to-integer
    
    Run Code Online (Sandbox Code Playgroud)

对于多维数组,您需要分配一个指针数组,然后用指向数组的指针填充该数组,如下所示:

int **p;
p = new int*[5]; // dynamic `array (size 5) of pointers to int`

for (int i = 0; i < 5; ++i) {
  p[i] = new int[10];
  // each i-th pointer is now pointing to dynamic array (size 10)
  // of actual int values
}
Run Code Online (Sandbox Code Playgroud)

这是它的样子:

在此输入图像描述

释放记忆

  1. 对于一维数组,

     // need to use the delete[] operator because we used the new[] operator
    delete[] p; //free memory pointed by p;`
    
    Run Code Online (Sandbox Code Playgroud)
  2. 对于2d阵列,

    // need to use the delete[] operator because we used the new[] operator
    for(int i = 0; i < 5; ++i){
        delete[] p[i];//deletes an inner array of integer;
    }
    
    delete[] p; //delete pointer holding array of pointers;
    
    Run Code Online (Sandbox Code Playgroud)

避免内存泄漏和悬空指针!


Pau*_*ans 6

你想要的东西:

int **P = new int*[7];
p[0] = new int[5];
p[1] = new int[5];
...
Run Code Online (Sandbox Code Playgroud)