说我有一个动态数组,如:
int* integers = new int[100];
有没有办法只删除数组的一部分,如:
int* integers2 = integers + 50;
delete[] integers2;
我想不仅要删除50以上的所有内容,而且如果我在原始整数数组上调用另一个delete [],那么它只会删除正确的内存量而不会尝试删除最初分配的数量和段错误
为什么我要这样做:我有一个数组级别的数据结构,我希望能够从一个完整的数组创建这个数据结构。所以我希望能够说出
int* level1 = integers;
int* level2 = integers + 50;
int* level3 = integers + 100;
但是当不再需要3级时,数据结构将自动删除[] level3。我需要知道这将表现正确,而不仅仅是破坏数组中的所有内容。如果它然后我需要创建新数组并复制内容,但是出于性能原因避免这样做会很好。
编辑:每个人似乎都得出结论,我应该首先使用动态调整大小容器(即vector,deque)作为我的数据结构。我使用数组级别是有充分理由的(并且它们的大小不同,就像我在我的例子中看起来一样)。我只是在寻找一种方法,让我的数据结构有一个构造函数,它接受一个数组或向量,而不需要将原始内容复制到新的数据结构中。
答案 0 :(得分:9)
不,这不会表现正常。你只能从delete[]
获得new[]
个指针,否则结果是未定义的,可能会发生不好的事情。
如果你真的需要让数组变小,你必须分配一个新的并手动复制内容。
答案 1 :(得分:0)
通常在分配内存时,指针前会有一些内务处理。
即。 houskeeping(指针)数据
你会搞砸了。
答案 2 :(得分:0)
int* integers2 = integers + 50;
delete[] integers2;
因为在int *上创建了new,所以不能正常工作,所以100 int的空间已经分配给整数,现在整数2只是指向整数的第50个位置的指针,它没有为它自己分配空间,所以使用删除不会删除其余的整数2,它只会产生不稳定的结果。
你可以做的是复制另一个阵列中的前50个,并完全删除前一个阵列。
delete只删除指定了空间的指针,使用delete指向另一个指向第一个指针的空间的指针不会删除分配给第一个指针的任何空格。
delete [] integers2不会删除分配给integers1或任何其他指针的任何空格。
答案 3 :(得分:0)
动态分配器(如new
)通常不喜欢你发布他们给你的内存的部分。如果您使用<malloc.h>
定义的库函数malloc()
和free()
而不是new
和delete
,那么您可以使用realloc()
,但在大多数情况下无论如何你都会关心它的大小差异。
动态调整容器大小通常使用指数规则来调整大小:如果空间不足,他们(例如)将分配加倍(并复制旧数据),如果删除数据直到使用(例如)不到一半的分配,他们复制到一个较小的分配。这意味着您永远不会浪费超过一半的内存,并且添加或删除每个元素的复制成本实际上是不变的。然而,实现所有这些都是痛苦的,所以只需使用std::vector
并让它为你做:)。
答案 4 :(得分:0)
不能使用new[]
分配的固定大小的数组来执行此操作。如果要使用动态数组,请使用其中一个STL容器,例如std::vector
。