我想知道在C++中由「刪除」運算符銷燬的內存會發生什麼情況。 以這種方式「銷燬」記憶意味着將給定的記憶片段設置爲0或其他東西?在C++中,刪除操作符意味着'銷燬'內存?
回答
它破壞(如在呼籲有關析構函數)傳遞給delete
對象實例,然後「釋放」的內存中,因此它可以被用於其它目的。
C++標準沒有說明在delete
之後內存的內容是什麼,它肯定不能保證爲零或任何其他值 - 也不能保證它不爲零 - 它可能是零,它可能保留以前的所有價值,或者其中一些部分可能會被改變,而其他部分可能會保持不變。
C和C++作爲語言的目標是「只做最低限度的必要」,因此典型的免費內存不會覆蓋「舊」內存。
你可以使用析構函數中的代碼將內存設置爲零,然後釋放它。
由於在刪除內容後不應使用內存,因此這應該不是問題。
推薦memset是最好的bug源。你所說的V-tables(C++沒有指定的東西,它只是一種實現技術)對所有的類成員都是有效的:如果它們是非平凡的對象,它們也有必須在class dtor返回。如果你消除了記憶,你會誤導一切。 – 2013-04-27 12:57:46
好的,刪除了memset的建議,因爲很難解釋它什麼時候可以使用也無法使用 - 無論如何,通常這樣做是毫無意義的。 – 2013-04-27 13:03:20
千萬不要使用它。 C++管理對象,而不是內存。除非你正在編寫一個原始分配器類(a-la'std :: allocator')或者重寫'new' /'delete',否則你不應該將內存作爲「裸機」來連接。 – 2013-04-27 13:23:04
delete
只是釋放內存(以前由new
分配),並且在某些對象已存儲在此內存中的情況下,也會調用析構函數。
delete
不會更改指針的值,也不會修改已釋放的內存,因此您會注意到很多人在調用delete
後纔會將NULL
指定給該指針,以確保它們將不會導致無效(懸掛)指針,其產生未定義的行爲。
值得去看一看:Is it good practice to NULL a pointer after deleting it?
不,這並不意味着將存儲器設置爲任何特定值+。內存只是回到可以重用的值堆中。運行時通常使用返回塊的幾個字節來存儲「簿記」信息,但它們不會將整個塊設置爲特定值。一旦內存塊被重用,它就是你的程序設置它的新值。
+有內存分析工具,讓您設定內存釋放一些「垃圾」的價值觀,以確保你得到一個崩潰得更快。
- 1. <%操作符在Scala泛型中意味着什麼?
- 2. 在C中初始化內存爲零意味着什麼?
- 3. 從QGraphicsScene中刪除/銷燬/刪除QGraphicsItem
- 4. Docker中的操作符$()意味着什麼
- 5. **在C/C++中意味着什麼?
- 6. 在動作中,/ =操作意味着什麼?
- 7. 在C++中重載刪除操作符
- 8. 這在C中意味着什麼?
- 9. 我在C++中意味着什麼?
- 10. #pragma在C中意味着什麼?
- 11. (* var)[n]在C++中意味着什麼
- 12. 在C++中意味着什麼?
- 13. [](){}構造在C++中意味着什麼?
- 14. <?=這在C++中意味着什麼?
- 15. 當Android操作系統銷燬服務時刪除通知
- 16. Rails控制檯凍結手動刪除/銷燬操作
- 17. C++刪除操作符
- 18. 在Rails中銷燬/刪除數據庫
- 19. @符號在java中意味着什麼?
- 20. C#方法意味着
- 21. Rails,銷燬與刪除?
- 22. Kendo UI Tooltip刪除/銷燬?
- 23. 在AngularJS中結尾意味着什麼double意味着
- 24. [Bindable]在動作中意味着什麼?
- 25. iPhone操作系統內存警告。不同層次意味着什麼?
- 26. 在C++中刪除操作
- 27. C++操作符新增並刪除內存泄漏與容器
- 28. 如何在C中停止/銷燬正在運行的操作#
- 29. %,這意味着
- 30. 在內存中打開文件意味着什麼?
看看這個http://www.cplusplus.com/reference/new/operator%20delete%5B%5D/ – 2013-04-27 11:27:18
我認爲這是一個很好的問題,因爲標準本身似乎有點不清楚什麼確切的說是「破壞」。它說C++的構造被用來創建,銷燬和操縱對象,而對象則是存儲區域。然而,它也表示析構函數用於銷燬對象,但我們可以明確地調用析構函數並仍然有可用的存儲區域。 (也許我正在對待這個問題的深度比它真正要求的更高) – 2013-04-27 11:33:08
@Armin好的,我看了看,thx。 – Zygmuntix 2013-04-27 11:33:37