gpt4 book ai didi

c++ - 在 C++ 中删除动态指针数组

转载 作者:搜寻专家 更新时间:2023-10-31 01:11:01 25 4
gpt4 key购买 nike

我有一个关于在 C++ 中删除动态指针数组的问题。假设我们有以下情况:

int n;
scanf("%d", &n);
Node **array1 = new Node*[n];
/* ... */

其中Node是预先定义的某种结构。假设在使用 new 运算符分配后,我们更改了 array1 的内容(但我们没有删除任何内容!)。如果数组中可能存在重复指针(无需在线性时间内对它们进行排序或插入集合),删除 array1 及其所有内容的正确方法是什么?

最佳答案

使用这个分配:

Node **array1 = new Node*[n];

array1 的内容未定义。每个元素都是一个 Node* ,并且因为内存未初始化,所以该值可以是任何值。

分配指针数组不会构造指向类的对象。

因此无论您将什么指针放入数组中,它们指向的对象都需要在别处构造和销毁。

所以要回答你的问题,删除 array1 的正确方法是

delete[] array1;

但是,请注意,这不会导致为每个 Node* 调用析构函数- 在删除数组之前,您应该处理放入数组的任何内容。

编辑:我对原始问题感到困惑,它提到数组中的“更改值”,就好像在您的示例中分配的数组中有一个有效值。

但是...既然我知道您想跟踪指针以便稍后删除,也许您可​​以为此目的创建另一个数组,其中每个指针只存在一次。因此,您拥有上面当前拥有的数组,其中包含指向可能重复的节点的指针,无论您出于何种目的使用它。然后你有另一个数组用于管理删除的明确目的,其中每个指针只出现一次。设置类似 nodeCleanupArray[i] = pNewNode 的东西应该很容易在pNewNode = new Node()之后,然后你可以在线性时间内爆破那个数组,delete每个元素。 (这意味着您不会费心检查 array1 中的元素,您会依赖 nodeCleanupArray 进行清理)

关于c++ - 在 C++ 中删除动态指针数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15419122/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com