2

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

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

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

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

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

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

4

2 回答 2

5

我有完全错误的想法吗?

恐怕是这样。

如果你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);
}
于 2010-10-29T23:39:58.837 回答
3

如果p->elems是指针,那么也是p->elems + i(假设操作已定义,即 i 是整数类型) - 并且p->elems + i == &p->elems[i]

无论如何,您很可能不想(也不能)从 int 数组中删除 int(无论是动态分配还是自动分配)。那是

int* ptr = new int[10];
delete &ptr[5]; // WRONG!

这简直是​​你做不到的。但是,如果结构包含数组的长度,则可以在更改结构包含的长度信息后考虑“调整大小”的数组 - 毕竟,没有办法告诉指针指向的数组的大小。

但是,如果您的数组是指向整数 ( int*[]) 的指针数组,并且这些指针指向动态分配的内存,那么是的,您可以删除单个项目,并且您可以按照代码行执行此操作(您显示的代码很少很难准确)。

于 2010-10-29T23:27:19.460 回答