5

在简单的一维数组中:

node *nodes =  new node[MAX_NODES];

删除者:

delete [] nodes;

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

但在这种情况下:

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

此语句是否buildingArray生成 3 个浮点指针的一维数组?这是释放线:

delete[] buildingArray;

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

4

3 回答 3

16

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

是的,它确实。

只需遵循以下规则:

您需要分别调用delete或调用delete []多次。newnew []


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


附带说明一下,使用std::vectororstd::array而不是动态分配的数组要好得多。

于 2013-02-23T06:24:31.050 回答
3

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

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

所以delete[]会完美地工作。

但是如今,使用new和运算符在智能指针delete中并不常见,除非您真的有充分的理由自己控制分配。

于 2013-02-23T06:27:31.607 回答
2

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

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

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

于 2013-02-23T06:26:43.497 回答