【问题标题】:How to understand this 2D dynamic array implementation? Is this the most basic implementation?如何理解这个二维动态数组实现?这是最基本的实现吗?
【发布时间】:2016-10-11 03:34:33
【问题描述】:

我是 C++ 新手,无法理解这段代码。我把我目前的理解放在了 cmets 中。这是思考这个问题的正确方式吗?如果没有,正在做什么? (简单来说)

int** arrayA;  //a pointer to a pointer
arrayA = new int* [2]; //Does this 2 mean that there will be 2 rows?

arrayA[0] = new int[3]; //for the first row, three columns
arrayA[1] = new int[3]; //for the second row, three columns

/*Are the two lines above this CREATING or just ACCESSING the array? */

如果我的数组有 3 行,我是否必须添加 arrayA[2] = new int[3];

我知道我也必须删除它,因为它是动态分配的,否则堆中会出现内存泄漏错误。正确的?

【问题讨论】:

  • 表示2行3列。他们将被访问为arrayA[row_number][column_number]
  • //2 pointers:错了。只有一个指针。
  • @Jaden,表示指向指针的指针。
  • 您所拥有的称为锯齿状数组,具有手动内存管理功能。而是使用a single std:.vector as storage 作为数组。
  • @Jaden,你的理解是准确的。回答中没有什么可说的了。

标签: c++ arrays dynamic-memory-allocation


【解决方案1】:

这不是传统的二维数组。这是一个指向数组的指针数组。不保证内存是连续的。但是,它有一个很好的特性,可以让你说:

my_pseudo_2d_array[1][3]

当它作为双指针传递给函数时 - 而作为指针传递的实际二维数组需要进行 row* width + column 数学运算才能访问元素。

【讨论】:

  • 这不只是静态数组的基本实现吗?纠正我我错了
  • 静态数组是一个连续的元素数组,并且尺寸最小。这具有每行一个指针的额外内存开销。一个二维整数数组的大小为宽度 * 高度 * sizeof(int)。这具有大小 width * height * sizeof(int) + height * sizeof(pointer) 此外,您的数组需要手动清理(在 for 循环中删除 [],然后是另一个 delete []),而静态数组是词法范围的。跨度>
  • 你最后一句中提到的数学不是必需的 - 你似乎描述了将二维数组别名为一维数组的情况
  • @M.M 如果您将其传递给函数并且在编写函数时没有可用的确切尺寸,则它是必需的。 (MyType * array, int width, int height) 是一个很常见的习语,不是吗?
  • 所以int randomarray[2][0] 是一个两行三列的静态数组,而anotherarray[1][3] 是一个动态分配的一行三列数组?我觉得如果我尝试这个会出错
猜你喜欢
  • 1970-01-01
  • 2014-09-23
  • 2019-03-10
  • 1970-01-01
  • 2017-01-18
  • 2012-06-20
  • 1970-01-01
  • 2022-12-23
  • 1970-01-01
相关资源
最近更新 更多