2014-10-16 18 views
-4

此代碼是否合法?可以「刪除」分配了「new [1]」的內存嗎?反之亦然?

int * a = new int[1]; 
delete a; 

還是這個?

int * a = new int; 
delete [] a; 

顯然,這看起來不正確,應該至少是氣餒,但會造成任何實際問題(內存泄漏和諸如此類的東西)?

+2

閱讀[舊的新東西 - 不匹配標量和矢量new和delete(http://blogs.msdn.com/b/oldnewthing/archive/2004/02/03/66660.aspx) 。 – DCoder 2014-10-16 12:32:40

+6

如果'delete'與任何表達式一起工作,爲什麼有人會用'delete []'來打擾?答案是否定的,這是不正確的,因爲它會導致未定義的行爲。 – user657267 2014-10-16 12:33:19

+0

我知道我可以寫一個內存管理器,這將是一個問題。你想知道哪個具體的內存管理器/編譯器是否會成爲問題? – franji1 2014-10-16 12:34:40

回答

5

匹配組合必須是: -

new; delete;

new[]; delete[];

如果混合使用這些了,你會得到未定義的行爲。由於這個,我看到代碼被炸燬。

+0

如果我可以在「代碼炸燬」中添加一些無用的瑣事 - 這個錯誤出現在Red Alert 2的發行版本中(在一個未使用的功能中,這是從該系列的前一個遊戲中遺留下來的)。如果該功能被激活,它確實會使遊戲崩潰,並且通過IDA和WinDBG追蹤它非常有趣。 – DCoder 2014-10-22 19:43:04

0

不。如果你new你應該delete。如果你new[]你應該delete[]

+1

我知道我應該**,我寫明瞭我。我的問題是問這是否會導致任何問題(以及它們究竟是什麼)。 – NPS 2014-10-16 12:31:32

+0

如果混合這些,會導致未定義的行爲。 – CoryKramer 2014-10-16 12:34:56

+0

最有可能你的堆被破壞,你會看到隨機點發生崩潰。 – sjdowling 2014-10-16 12:36:12

相關問題