2011-10-12 65 views
7

说我有一个动态数组,如:C++动态数组的删除部分

int* integers = new int[100]; 

有没有办法删除的磁盘阵列中的一部分,如:

int* integers2 = integers + 50; 
delete[] integers2; 

我想不仅删除50以后的所有内容,但是如果我在原始整数数组上调用另一个delete [],那么它只会删除正确数量的内存,而不会尝试删除最初分配的数量和seg错误。

为什么我想这样做:我有一个数据结构层次结构的数组,我希望能够从一个完整的数组中创建这个数据结构。所以我想可以说

int* level1 = integers; 
int* level2 = integers + 50; 
int* level3 = integers + 100; 

但是当不再需要3级时,数据结构会自动删除[] level3。我需要知道,这将行为正确,而不仅仅是破坏阵列中的所有内容。如果它会,那么我需要创建新的数组并复制内容,但是出于性能原因避免这样做会很好。

编辑:每个人似乎都跳到结论,我应该首先使用动态调整大小的容器(即矢量,双向)在我的数据结构。我使用数组的级别有一个很好的理由(并且它们的大小不一样,就像我在例子中看起来那样)。我只是寻找一种好的方法,让我的数据结构的构造函数接受数组或向量,而不需要将原始内容复制到新的数据结构中。

+0

std :: deque是你在找什么。 –

+0

没有它没有。事实上,我正在寻找的基本上是一种从数组中创建双端队列而不从原始数组复制值的方法。 – Floss

+0

'std :: deque'的行为很像一个自动调整大小的数组。一个直线阵列不能调整大小(除非它被分配'malloc',然后只调整大小) –

回答

9

不,这样做行为不正确。你只能从new[]得到delete[]指针,否则结果是不确定的,可能会发生不好的事情。

如果你真的需要数组变小,你必须分配一个新的并手动复制内容。

+0

好的谢谢你的信息 – Floss

0

通常,当内存被分配时,指针前有一些内务处理的东西。

即Houskeeping(指针)数据

你会搞砸了。

0
int* integers2 = integers + 50; 
delete[] integers2; 
因为新上INT *创建的,所以100为int的空间已被分配到整数

都不行,现在integers2只有一个指向整数50的位置,它没有分配给它的空间,其自己,所以使用删除不会删除其余的整数2,它只会给不稳定的结果。

你可以做的是将第一个50复制到另一个数组中,并完全删除以前的数组。

删除将只删除已分配空间的指针,使用删除指向指向第一个指针的空间的另一个指针不会删除分配给第一个指针的空间。

delete []整数2不会删除分配给整数1或任何其他指针的任何空间。

0

动态分配器(如new)通常不喜欢你发布部分他们给你的内存。如果您使用<malloc.h>已定义库函数malloc()free()而不是newdelete,那么您可以使用realloc(),尽管在大多数情况下您会关心它将随意复制的大小差异。

动态调整容器大小通常使用指数规则进行调整大小:如果在空间不足的情况下(例如)将分配加倍(并复制旧数据),如果在使用前删除数据(例如)少于他们复制到较小分配的一半分配。这意味着你永远不会浪费超过一半的内存,并且添加或删除每个元素的复制成本实际上是不变的。实现这一切都是一个痛苦的屁股,但是,所以只需使用std::vector,让它为你做:)。

+0

虽然使用std :: vector并不能解决我原来的问题。出于某种原因,我使用了一组分层数组而不是单个动态调整大小数组(即向量)。问题不在于它是如何存储的,而是我试图让一个简单的方法将矢量或动态数组作为我的数据结构的输入,而不需要从原始数据结构中复制所有内容 – Floss

+0

@Floss:什么是'分层阵列'?数组的数组? 'vector :: data()'有什么问题? –

0

不,你不能用固定大小的数组来分配new[]。如果你想有一个动态数组,使用其中一个STL容器,例如std::vector