如何在C++中删除这个二维数组

5

在简单的一维数组中:

node *nodes =  new node[MAX_NODES];

删除者:

delete [] nodes;

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

但是在这种情况下:

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

这个语句是否将buildingArray作为一个包含3个浮点指针的单维数组?这是释放内存的代码行:
delete[] buildingArray;

上述的delete是否会删除数组,但我对它是否会删除其引用存有疑虑?


使用向量代替 - http://www.cplusplus.com/reference/vector/vector - 更加简单。 - Ed Heal
5
有时候现有的代码库强制我们使用二维数组。如果我能够对评论进行反对票... - codetaku
3个回答

16

上述的释放代码会删除数组吗?

是的,它会删除数组。

只需遵循以下规则:

您需要调用与 newnew [] 相应次数相同的 deletedelete []


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

顺便说一下,使用 std::vectorstd::array 要比动态分配数组好得多。


好的,所以这里每个元素都没有动态内存,只有一个维度(行)有动态内存,而3列具有静态内存,因此不需要释放它们。我是对的吗? - Anubha
@Anubha:语句float (*buildingArray)[3] = new float[10][3];分配了足够的动态内存来存储10个包含3个浮点数的数组。整个存储空间位于自由存储区(也称为堆)。但是,由于它是使用单个调用new []分配的,因此单个调用delete []可以完美地释放它。 - Alok Save
好的,在这个问题中https://dev59.com/53NA5IYBdhLWcg3wgeAd,数组初始化是使用了两个new语句,因此简单的delete[] ary; 在那种情况下不能起作用? - Anubha
@Anubha:是的。在问题中,用户想要创建一个二维数组,这实际上是指向数组的指针数组。单独的指针并不是很有用,它需要指向有效的内存才能使用。由于指针数组中的每个元素都是指针,因此指针数组也是如此。每个元素必须单独分配内存,因此需要通过调用“delete”来单独释放内存。我所说的规则是正确的,只要记住这个规则,你就不会被绊倒。 - Alok Save
我的数组,是二维的吗? - Anubha
@Anubha:不,这是一个指向数组的指针。我并不是有意冒犯,但既然你开始学习了,好书应该会对你有很大的帮助。我不知道你的课程要求读哪些书,但你可以从我提供的链接中选择一本。 - Alok Save

3
是的,它可以。解释是因为内存中没有关于数组有多少维的信息。
如果您有一个3*4项的数组,它与一个12项的数组完全相同。只是访问特定元素的方式(这些元素以逐行方式存储)发生了变化。
所以delete[]将完美地工作。
但是使用newdelete运算符在现今并不常见,而是使用智能指针,除非您真的有很好的理由来控制分配。

2
new float[10][3] 分配了一个包含 10 个长度为 3 的 float 数组,并返回第一个元素的指针(它是一个长度为 3 的 float 数组)。
在这个指针上调用 delete[] 将会删除整个数组。
两种情况之间唯一的区别在于,第一种情况下动态分配数组中存储的值的类型是 float,而第二种情况中的类型是 float[3]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接