![](/img/trans.png)
[英]How do I properly delete an array of doubles through a pointer after the pointer has been iterated?
[英]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_back
或emplace_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.