【问题标题】:How do I delete this 2D array in c++如何在 C++ 中删除这个二维数组
【发布时间】:2013-02-23 06:21:12
【问题描述】:

在简单的一维数组中:

node *nodes =  new node[MAX_NODES];

删除者:

delete [] nodes;

删除数组中分配的所有节点。

但在这种情况下:

float (*buildingArray)[3] = new float[10][3];

此语句是否使 buildingArray 成为 3 个浮点指针的单维数组?这是释放行:

delete[] buildingArray;

上面的释放delete是不是数组,但是我怀疑它是否会删除它的引用?

【问题讨论】:

标签: c++ pointers memory-management


【解决方案1】:

上述解除分配是否会删除数组?

是的。

只要遵守规则:

您需要拨打deletedelete [] 的次数与您分别拨打newnew [] 的次数相同。


如果您有一个指针数组,其中每个索引都分配了动态内存,则需要显式循环遍历它并显式释放每个数组元素。


顺便说一句,您最好使用std::vectorstd::array 而不是动态分配的数组。

【讨论】:

  • 好的,所以这里每个元素都没有动态内存,只有 1 维(行)有动态内存,3 列有静态内存,所以不需要取消分配它们。我说的对吗?
  • @Anubha:float (*buildingArray)[3] = new float[10][3]; 语句分配了足够的动态内存来存储 3 个浮点数的 10 个数组。整个存储都在 freestore(又名堆)上。但是由于它是使用对new [] 的一次调用来分配的,所以对delete [] 的一次调用就可以完美地分配它。
  • 好的,所以在这个问题stackoverflow.com/questions/936687/… 中,数组初始化使用了 2 个新语句,因此简单的 delete[] ary ;在那种情况下就行不通了?
  • @Anubha:是的。在 Q 中,用户想要创建一个二维数组,它只不过是指向数组的指针数组。指针本身并不是很有帮助,它需要指向有效内存才能使用。由于每个元素都是指针数组中的一个指针,因此指针数组也是如此。每个元素必须单独分配内存,因此需要通过调用 delete 单独释放内存。我说的规则很好,只要记住规则,你就不会绊倒。
  • 所以我的数组是二维的吗?
【解决方案2】:

是的。解释是因为内存中没有关于你的数组有多少维度的信息。

如果您有一个 3*4 项数组,它与 12 项数组完全相同。只是您处理特定元素(以逐行方式存储)的方式发生了变化。

所以delete[] 将完美运行。

但如今,smart pointers 使用 newdelete 运算符并不常见,除非您真的有充分的理由自己控制分配。

【讨论】:

    【解决方案3】:

    new float[10][3] 分配一个由 3 个 floats 组成的 10 个数组的数组,并返回一个指向第一个元素的指针(这是一个由 3 个浮点数组成的数组)。

    在这个指针上调用delete[]会导致整个数组被删除。

    这两种情况的唯一区别是,在第一种情况下,存储在动态分配数组中的值的类型是float,而在第二种情况下,类型是float[3]

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-11-27
      • 2021-10-24
      • 2021-06-30
      • 2015-02-11
      • 2012-11-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多