此代碼是否合法?可以「刪除」分配了「new [1]」的內存嗎?反之亦然?
int * a = new int[1];
delete a;
還是這個?
int * a = new int;
delete [] a;
顯然,這看起來不正確,應該至少是氣餒,但會造成任何實際問題(內存泄漏和諸如此類的東西)?
此代碼是否合法?可以「刪除」分配了「new [1]」的內存嗎?反之亦然?
int * a = new int[1];
delete a;
還是這個?
int * a = new int;
delete [] a;
顯然,這看起來不正確,應該至少是氣餒,但會造成任何實際問題(內存泄漏和諸如此類的東西)?
匹配組合必須是: -
new; delete;
new[]; delete[];
如果混合使用這些了,你會得到未定義的行爲。由於這個,我看到代碼被炸燬。
如果我可以在「代碼炸燬」中添加一些無用的瑣事 - 這個錯誤出現在Red Alert 2的發行版本中(在一個未使用的功能中,這是從該系列的前一個遊戲中遺留下來的)。如果該功能被激活,它確實會使遊戲崩潰,並且通過IDA和WinDBG追蹤它非常有趣。 – DCoder 2014-10-22 19:43:04
不。如果你new
你應該delete
。如果你new[]
你應該delete[]
。
我知道我應該**,我寫明瞭我。我的問題是問這是否會導致任何問題(以及它們究竟是什麼)。 – NPS 2014-10-16 12:31:32
如果混合這些,會導致未定義的行爲。 – CoryKramer 2014-10-16 12:34:56
最有可能你的堆被破壞,你會看到隨機點發生崩潰。 – sjdowling 2014-10-16 12:36:12
混合標量和數組(分配)運算符會導致未定義的行爲。 delete和delete []之間的定義差異在於後者調用數組的所有元素的析構函數。
閱讀[舊的新東西 - 不匹配標量和矢量new和delete(http://blogs.msdn.com/b/oldnewthing/archive/2004/02/03/66660.aspx) 。 – DCoder 2014-10-16 12:32:40
如果'delete'與任何表達式一起工作,爲什麼有人會用'delete []'來打擾?答案是否定的,這是不正確的,因爲它會導致未定義的行爲。 – user657267 2014-10-16 12:33:19
我知道我可以寫一個內存管理器,這將是一個問題。你想知道哪個具體的內存管理器/編譯器是否會成爲問題? – franji1 2014-10-16 12:34:40