簡體   English   中英

如何正確刪除指向數組的指針

[英]how to properly delete a pointer to array

我是C ++的新手,我對數組和指針感到困惑。 有人能告訴我如何正確刪除指針。 例如,

int *foo;
foo = new int[10];

delete foo;

要么

delete [] foo;

謝謝。

new[]delete[]匹配的要求在技術上是正確的。

然而,更好的是(至少在我看來),忘記你曾經聽說過new[] ,再也不會再使用它了。 我很確定自從上次使用new[]以來已經(至少)10年了,如果我對這種情況了解得很清楚,我就會早點停下來。 幾乎任何時候你甚至考慮使用new[]std::vector (或者可能是std::deque )將是更好的選擇。

如果你試圖創建一個大致相當於vector或者deque東西,你通常也不想使用new[] 他們的方式(至少通常情況下,雖然可以通過自定義的Allocator類改變它)是使用operator new分配“原始”存儲(這非常像malloc你只需給它一個大小,它給你那很多字節的存儲空間)。 然后使用placement new運算符在該空間中創建對象,並顯式調用對象的析構函數以銷毀該空間中的對象。

舉一個例子,這是允許std::vector支持reserve ,它允許你分配額外的空間,直到你調用push_backemplace_back這樣的東西來創建一個實際的對象時emplace_back為對象分配。

使用new[] ,必須創建指定類型的對象,填充您分配的所有空間。 你不能創建像push_back這樣的東西,它會在集合中添加一個新對象,因為集合總是已經“滿”。 你所能做的只是分配一個比舊的更大的新集合(因此集合的每一個添加都是O(N)而不是std::vector支持的分攤的O(1) - 效率的巨大損失)。

它的:

delete[] foo;

編輯:現代編譯器確實需要您使用正確的delete操作符,否則它們可能會泄漏內存或無法運行正確的析構函數。

(我之前說它在實踐中沒有什么區別。大約10年前,我嘗試了許多不同的編譯器,如果你錯誤地省略了[] ,卻找不到實際泄露內存的編譯器。但是暴徒的嚎叫 - 見下面 - 強迫我重新嘗試我的實驗,似乎現代編譯器/ libc ++真的很關心。)

如果使用new []運算符分配對象數組,則必須使用delete []運算符,因此非數組new只能與非數組delete

int *a = new int[10];
int *b = new int;

delete [] a;
delete b;

如果你執行new <type>[]你必須delete [] 這是一個足夠簡單的規則,值得記住。

你走進前門,把它打開了。 然后你走到后門試圖關閉它,但是因為它已經關閉所以你把它砸了。

foo = new int [10];  // so when you open the front door
delete [] foo;       // please remember to close the front door.

foo = new int;       // and when you open the back door
delete foo;          // please remember to close the back door.

不要混淆它們!

任何時候你new一個數組你使用delete[] 有時候你使用new創建了一個數組 - 然后你仍然需要使用delete[] - 沒有出路。 因此,在新的[]'ed'中使用delete []並不是一個規則,而是在刪除數組時“使用delete []”。

typedef int array[5];

int *a = new array;
delete[] a; // still delete[] !

暫無
暫無

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

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