使用C++ new []为2D数组分配内存

gen*_*gen 1 c++ arrays memory-management multidimensional-array

当我从用户那里读取一些值并且我需要创建一个特定大小的数组时,我会这样做:

#include <iostream>
using namespace std;    
unsigned* numbers;
int main()
{
int a;
cin >> a;
numbers = new unsigned[a];
}
Run Code Online (Sandbox Code Playgroud)

如何使用2d数组(从用户读取大小a*b)?

Bre*_*ent 7

如果a和b分别是行数和列数,则可以像这样分配数组:

new unsigned[a * b];
Run Code Online (Sandbox Code Playgroud)

要访问行i和列的元素j,请执行以下操作:

numbers[i * b + j]
Run Code Online (Sandbox Code Playgroud)

然而,请注意,实际上你几乎肯定会更好地使用std::vector任何你想做的事情,但你可能还没有学到这一点:)


Arn*_*rtz 6

在代码中看起来像2D数组的任何东西都不是内存中的物理2D数组,而是一个普通的内存块或分散的,这取决于你如何分配它.

  • 你可以通过在N个指针的另一个动态数组中动态分配N个数组来折磨自己,就像nrussel的回答所暗示的那样.
  • 你可以制作一个矢量矢量,比如billz和Arun CB建议 - 这可以减轻你自己管理分配的内存但仍然留下N + 1分散的分配,这是不是很高效.
  • Brennan Vincent的回答建议分配一个包含*b元素的动态数组,它会在内存中为你提供一个连续的块.将其与std::vector他提到的内置动态内存管理相结合并感到高兴:

    std::vector<unsigned> matrix(a*b);

如果您希望矩阵方便访问,请将整个事物包装到一个类中,使您可以访问具有2D坐标的元素.但请远离自己管理内存.它只会伤害你和任何必须维护该代码(并搜索内存泄漏)的人.

  • 那么,使用答案来做出更好的答案就是stackexchange的灵魂:)牛顿说站在巨人肩膀上的是什么...... (2认同)