当数组缩小时是否有必要删除元素?

Zig*_*ggy 2 c++ delete-operator

我是一名学生在C++中编写一个从int数组末尾删除零的方法.数组在结构中,结构也有一个int,用于跟踪数组的长度.

该方法从最后一个开始检查每个元素,直到它遇到第一个非零元素,并通过改变长度值将一个元素标记为"最后一个元素".然后该方法返回到原始的"最后一个元素",删除那些不在界限内的元素(零).

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

if (i > p->length - 1) {
  delete (p->elems + i); // free ith elem
Run Code Online (Sandbox Code Playgroud)

但这条线路是错误的.删除指针,是吗?所以我的感觉是我需要恢复指向数组的指针,然后添加i它以便我将拥有我想要删除的整数的内存位置.

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

Ste*_*sop 5

我有完全错误的想法吗?

我想恐怕是的.

如果您new[]拨打一个电话来分配一个数组,那么您必须delete[]拨打一个电话来释放它:

int *p = new int[10];
...
delete[] p;
Run Code Online (Sandbox Code Playgroud)

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

struct Foo {
    int data[10];
};

Foo *foo = new Foo;
...
delete foo;
Run Code Online (Sandbox Code Playgroud)

没有办法释放阵列的一部分.

一个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);
}
Run Code Online (Sandbox Code Playgroud)