2014-02-15 95 views
0

在C中,free()用於釋放內存,比如free(ptr)。據我所知,在庫代碼中的ptr之前分配額外的內存來存儲塊大小信息。在調用free()之後,整個塊會被跟蹤並釋放。C++中的邏輯刪除和刪除[]

在C++中,有兩種形式的new和delete。一個是數組。如果使用new[],則應使用delete[]。例如,

int ptr = new [10]; 
delete [] ptr; 

問題1:我可以在這裏使用delete ptr嗎?如果那是好的,如果delete ptr + 2

問題2:如果delete[]必須用於匹配new[],爲什麼我們需要兩種形式的刪除?只需要一個表格,例如delete就足夠了。

感謝您的所有建議!

感謝Mgetz。問題2應該是:爲什麼C++標準在任何情況下都建議刪除[]並刪除如果只有一個正確格式?

+0

打開你的想法http://www.parashift.com/c++-faq/freestore-mgmt.html – lsalamon

+0

這是C++的塵土飛揚的角落之一。避免新的[]和刪除[]像瘟疫。 – epx

回答

2

Q1:可以使用delete,但它是錯誤的。

這將通常「工作」,只要它能夠正確釋放分配的內存,但不會正確調用析構函數。對於微不足道的類型,你通常不會看到任何區別,但這並不意味着它不是錯的。無論如何,這是未定義的行爲,你應該避免,如果你可以(調用UB沒收任何保證你的代碼可以工作,它當然可以工作,但你永遠無法100%確定)。
刪除ptr+2也是未定義的行爲,幾乎肯定不會「工作」,甚至沒有。通常情況下,這隻會導致程序崩潰。

Q2:你需要兩個,因爲它們意味着不同的東西。一種意思是「刪除這個指向單個對象的指針」,而另一種意思是「刪除這個指向數組的指針」。
顯然,編譯器需要爲這些不同的事情生成不同的代碼。

+0

對於第1點,glibc在運行時告訴你,如果你有一個不匹配的allocate/deallocate對,並且取決於環境中的MALLOC_CHECK_的值,它可能會中止程序。這是一個明顯的差異。 – SirGuy

+0

@GuyGreer:我的版本似乎並沒有(通常它看起來「正常工作」,當然除非正確調用析構函數),但是如果你的構建警告甚至中止,那很好。我非常喜歡放棄或硬崩潰,而不是「無論如何」行爲隱藏錯誤。努力放棄並儘早強制編寫正確的代碼。 – Damon

0

您需要這兩種形式,因爲與mallocfree,newdelete不同,不僅僅是分配和釋放內存;他們也分別構建和破壞對象。

newdelete處理標量對象,而new[]delete[]處理對象數組。

當你調用new T[n],它會爲Tn副本分配足夠的內存,然後構建分配的內存中n實例。同樣,調用delete[]將導致這些實例被破壞,然後再釋放。

很明顯,因爲你不通過ndelete[]信息被藏匿的地方通過實施,但該標準不要求的實現,如果你打電話delete,而不是銷燬所有n對象。該實現可能會破壞第一個對象,它可能會正確運行並銷燬所有對象,或者可能導致demons to fly out of your nose

簡單地說,它是未定義的行爲,有沒有說會發生什麼,這是最好的當務之急你避免它。