2013-04-27 33 views
2

我想知道在C++中由「刪除」運算符銷燬的內存會發生什麼情況。 以這種方式「銷燬」記憶意味着將給定的記憶片段設置爲0或其他東西?在C++中,刪除操作符意味着'銷燬'內存?

+0

看看這個http://www.cplusplus.com/reference/new/operator%20delete%5B%5D/ – 2013-04-27 11:27:18

+0

我認爲這是一個很好的問題,因爲標準本身似乎有點不清楚什麼確切的說是「破壞」。它說C++的構造被用來創建,銷燬和操縱對象,而對象則是存儲區域。然而,它也表示析構函數用於銷燬對象,但我們可以明確地調用析構函數並仍然有可用的存儲區域。 (也許我正在對待這個問題的深度比它真正要求的更高) – 2013-04-27 11:33:08

+0

@Armin好的,我看了看,thx。 – Zygmuntix 2013-04-27 11:33:37

回答

6

它破壞(如在呼籲有關析構函數)傳遞給delete對象實例,然後「釋放」的內存中,因此它可以被用於其它目的。

C++標準沒有說明在delete之後內存的內容是什麼,它肯定不能保證爲零或任何其他值 - 也不能保證它不爲零 - 它可能是零,它可能保留以前的所有價值,或者其中一些部分可能會被改變,而其他部分可能會保持不變。

C和C++作爲語言的目標是「只做最低限度的必要」,因此典型的免費內存不會覆蓋「舊」內存。

你可以使用析構函數中的代碼將內存設置爲零,然後釋放它。

由於在刪除內容後不應使用內存,因此這應該不是問題。

+0

推薦memset是最好的bug源。你所說的V-tables(C++沒有指定的東西,它只是一種實現技術)對所有的類成員都是有效的:如果它們是非平凡的對象,它們也有必須在class dtor返回。如果你消除了記憶,你會誤導一切。 – 2013-04-27 12:57:46

+0

好的,刪除了memset的建議,因爲很難解釋它什麼時候可以使用也無法使用 - 無論如何,通常這樣做是毫無意義的。 – 2013-04-27 13:03:20

+0

千萬不要使用它。 C++管理對象,而不是內存。除非你正在編寫一個原始分配器類(a-la'std :: allocator')或者重寫'new' /'delete',否則你不應該將內存作爲「裸機」來連接。 – 2013-04-27 13:23:04

4

delete只是釋放內存(以前由new分配),並且在某些對象已存儲在此內存中的情況下,也會調用析構函數。

delete不會更改指針的值,也不會修改已釋放的內存,因此您會注意到很多人在調用delete後纔會將NULL指定給該指針,以確保它們將不會導致無效(懸掛)指針,其產生未定義的行爲

值得去看一看:Is it good practice to NULL a pointer after deleting it?

3

不,這並不意味着將存儲器設置爲任何特定值+。內存只是回到可以重用的值堆中。運行時通常使用返回塊的幾個字節來存儲「簿記」信息,但它們不會將整個塊設置爲特定值。一旦內存塊被重用,它就是你的程序設置它的新值。


+有內存分析工具,讓您設定內存釋放一些「垃圾」的價值觀,以確保你得到一個崩潰得更快。