C++ 使用 new 创建二维数组

打印 上一主题 下一主题

主题 1854|帖子 1854|积分 5562

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
1. 直接创建

C++ 使用 new 创建二维数组最直接的方法就是 new T[M][N]。返回的指针类型是 T (*)[N],它是指向数组的指针,可以直接使用数组下标形式访问元素。释放内存直接使用delete[]。示例代码:
  1. #include <iostream>
  2. class A
  3. {
  4. public:
  5.     A()
  6.     {
  7.         std::cout << "A::A" << std::endl;
  8.     }
  9.     ~A()
  10.     {
  11.         std::cout << "A::~A" << std::endl;
  12.     }
  13.     int x;
  14. };
  15. int main()
  16. {
  17.     A (*p)[3] = new A[2][3];
  18.     delete[] p;
  19. }
复制代码
编译器进行下标转换时,并没有用到第 0 维的大小,而其它维的大小都是必须的。这也就是为什么下面代码能正确执行。
  1. A::A
  2. A::A
  3. A::A
  4. A::A
  5. A::A
  6. A::A
  7. A::~A
  8. A::~A
  9. A::~A
  10. A::~A
  11. A::~A
  12. A::~A
复制代码
由于多维数组本质上是一维数组,所以释放内存都是 delete[] p,而没有奇怪的 delete[][] 语法。
2. 借助指针数组

还有一种方法就是先 new T*[M] 创建一个指针数组,其每个元素保存每一行的首个元素的地址,再使用 new T[N] 创建每一行。示例代码如下:
  1. T a[M][N]          --> T b[M * N],           a[i][j]    --> b[i * N + j]
  2. T a[M][N][O] --> T b[M * N * O], b[i][j][k] --> b[i * N * O + j * O + k]
复制代码
这种方法非常繁琐,首先 new T*[M] 不能写成 new (T(*)[M]),因为它是指针数组而不是数组指针。其次,需要对每一行调用 new T[N]。释放内存时,要先使用 delete[] 释放每一行,再调用 delete[] 释放数组指针。这几个步骤一步都不能错,不然就出现野指针或者内存泄漏。这段代码我也是用 Address Sanitizer 和 Leak Sanitizer 检查一遍才写对。
这种方法唯一的好处就是可以创建交错数组(Jagged Array),也就是每一行的大小不一样。例如:
  1. int a[2][3];
  2. int (*p)[3] = a;
复制代码
3. 借助 std::vector

可以用 std::vector 对上面这种方法进行包装,使其更加易用。示例代码如下:
[code]std::vector v{ std::vector(3), std::vector(4) };std::cout
回复

使用道具 举报

0 个回复

正序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

河曲智叟

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表