gpt4 book ai didi

c++ - 是否有必要在数组收缩时删除元素?

转载 作者:搜寻专家 更新时间:2023-10-30 23:49:35 24 4
gpt4 key购买 nike

我是一名学生,正在使用 C++ 编写一个从整数数组末尾删除零的方法。该数组在一个结构中,该结构还有一个 int 来跟踪数组的长度。

该方法从最后一个开始检查每个元素,直到遇到第一个非零元素,并通过更改长度值将那个元素标记为“最后一个元素”。然后该方法返回到原始的“最后一个元素”,删除那些没有越界的元素(零)。

如果 i 大于更新后的数组长度,删除数组中第 i 个元素的部分如下所示:

if (i > p->length - 1) {
delete (p->elems + i); // free ith elem

不过那条线是错误的。删除需要一个指针,是吗?所以我的感觉是,我需要恢复指向数组的指针,然后将i添加到它,这样我就会有我要删除的整数的内存位置。

我的直觉错了吗?错误是微妙的吗?或者,我有完全错误的想法吗?我开始怀疑:我真的需要释放这些原语吗?如果它们不是原语,我将需要,在那种情况下,我将如何?

最佳答案

我的想法完全错误吗?

恐怕是这样。

如果您调用一个new[] 来分配一个数组,那么您必须调用一个delete[] 来释放它:

int *p = new int[10];
...
delete[] p;

如果您的数组在一个结构中,并且您调用一次来分配该结构,那么您必须调用一次来释放它:

struct Foo {
int data[10];
};

Foo *foo = new Foo;
...
delete foo;

无法释放数组的一部分。

int[10] 数组实际上 10 个整数,一行(也就是说,32 位系统上的 40 字节内存,可能加上开销)。存储在数组中的整数 占用该内存 - 它们本身不是内存分配,不需要释放它们。

综上所述,如果你想要一个可变长度数组:

这就是 std::vector 的用途

#include <vector>
#include <iostream>

struct Foo {
std::vector<int> vec;
};

int main() {
Foo foo;

// no need for a separate length: the current length of the vector is
std::cout << foo.vec.size() << "\n";

// change the size of the vector to 10 (fills with 0)
foo.vec.resize(10);

// change the size of the vector to 7, discarding the last 3 elements
foo.vec.resize(7);
}

关于c++ - 是否有必要在数组收缩时删除元素?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4056451/

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