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它以便我将拥有我想要删除的整数的内存位置.
我的直觉是错的吗?错误是否微妙?或者,我有完全错误的想法吗?我开始怀疑:我真的需要释放这些原语吗?如果他们不是原始人我需要,在那种情况下,我将如何?
我有完全错误的想法吗?
我想恐怕是的.
如果您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个字节的内存,可能加上开销).存储在数组中的整数值占用该内存 - 它们本身不是内存分配,并且不需要释放它们.
总而言之,如果你想要一个可变长度数组:
#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)