2011-07-01 148 views
5

可能重複的數組:
delete[] supplied a modified new-ed pointer. Undefined Behaviour?刪除[]字符

比方說,我已經使用分配字符new char[number]了一把。

是否可以刪除只有幾個結束字符(類似delete[] (charArray + 4);,這應該會取消分配除前四個字符以外的所有字符)?

,我讀了一些實現new[]存儲對象的數量對象數組,這樣delete[]知道多少個對象解除分配,因此它可能是不安全的做,我問什麼...

之前分配

謝謝。

編輯:

手動刪除使用單獨delete語句以安全的方式做我問什麼不需要的終字節?

回答

1

唯一「安全」的方法是分配一個新陣列,複製數據並刪除舊數據。或者,您可以按照std::vector的方式來區分「容量」(數組大小)和「大小」(其中的元素數量)。

+0

你能解釋一下'std :: vector'的方式嗎? – slartibartfast

+0

@myrkos它分配空間來存儲* n *個元素,但它可能會將其大小報告爲* <= n *。這是爲了更有效地調整大小。 – Maxpm

+0

@myrkos:它用':: operator new'分配「原始」空間,然後使用放置'new'將原始空間轉換爲對象。當它需要銷燬對象時(例如,當'vector'超出範圍或者'erase'元素時),它直接調用dtor來做到這一點。 –

6

不,您必須delete[]new[]返回的指針完全相同。

0

不,您只能刪除整個陣列。

2

您不能刪除數組的特定段。

如果你只是在C字符串操作,你可以一個字符集\0,並且在操作字符串的任何功能將停在那裏,因爲C字符串是空終止的。

如果你實際上需要釋放內存,那麼最接近你可能會創建一個新的,更小的陣列,複製元素,並舊的數組。

char* TenCharactersLong = new char[10]; 
// ... 
char* FirstFiveCharacters = new char[5]; 
for (std::size_t Index = 0; Index < 5; Index++) 
{ 
    FirstFiveCharacters[Index] = TenCharactersLong[Index]; 
} 
delete[] TenCharactersLong; 
1

不,對不起。內存分配對於碎片,對齊,填充,開銷等非常複雜。像這樣的功能只會進一步放大這些問題。

手動刪除不需要的結束字節使用單獨的刪除語句安全的方式來做我在問什麼?

甚至不要嘗試。這可能是危險的。總是用delete []釋放數組。

我強烈建議你閱讀的C++ FAQ精簡版關於這個主題:16.1316.14

0

不,你不能這樣做。我建議使用這個std :: vector。通過這種方式,您可以精確定位要刪除的索引,並讓庫爲您處理。