簡體   English   中英

C ++刪除動態數組的一部分

[英]C++ Deleting part of dynamic array

假設我有一個動態數組:

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。 我需要知道這將表現正確,而不僅僅是破壞數組中的所有內容。 如果它將然后我需要創建新數組並復制內容,但是出於性能原因避免這樣做會很好。

編輯:每個人似乎都得出結論,我應該首先使用動態調整大小容器(即vector,deque)作為我的數據結構。 我使用數組級別是有充分理由的(並且它們的大小不同,就像我在我的例子中看起來一樣)。 我只是在尋找一種方法,讓我的數據結構有一個構造函數,它接受一個數組或向量,而不需要將原始內容復制到新的數據結構中。

不,這不會表現正常。 你只能delete[]你從new[]獲得的delete[]指針,否則結果是未定義的,可能會發生不好的事情。

如果您確實需要更小的數組,則必須分配一個新數組並手動復制內容。

通常,當內存被分配時,指針前面會有一些內務處理。

即houskeeping(指針)數據

你會搞砸了。

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

因為new是在int *上創建的,所以不能正常工作,所以100 int的空間已經分配給整數,現在整數2只是一個指向第50個整數位置的指針,它沒有自己分配給它的空間,所以使用delete不會刪除其余的整數2,它只會給出不穩定的結果。

你可以做的是復制另一個數組中的前50個,並完全刪除前一個數組。

delete只會刪除分配給它的空間的指針,使用delete指向另一個指向第一個指針的空間的指針將不會刪除分配給第一個指針的任何空格。

delete [] integers2不會刪除分配給integers1或任何其他指針的任何空格。

動態分配器(如new )通常不喜歡你釋放他們給你的部分內存。 如果使用<malloc.h>定義的庫函數malloc()free()而不是newdelete ,那么你可以使用realloc() ,盡管在大多數情況下你會關心它只是要復制的大小差異無論如何,對你而言。

動態調整容器大小通常使用指數規則來調整大小:如果空間不足,他們(例如)將分配加倍(並復制舊數據),如果刪除數據直到使用(例如)不到一半他們將分配復制到較小的分配中。 這意味着您永遠不會浪費超過一半的內存,並且添加或刪除每個元素的復制成本實際上是不變的。 然而,實現所有這些是屁股的痛苦,所以只需使用std::vector並讓它為你做:)。

不,你不能用分配了new[]的固定大小的數組來做這件事。 如果要使用動態數組,請使用其中一個STL容器,例如std::vector

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM