5
A
回答
17
當您使用delete
時,C++想要調用對象上的析構函數,但將它傳遞給free
不允許發生這種情況。如果對象包含其他對象,那麼這些對象的析構函數也不會被調用。如果對象中有指針,那麼這些指針就不會被釋放。
另外,C++的new
和delete
實際上可以從malloc
要求較大的內存量和使用記賬額外的(如存儲的析構函數的地址),所以你傳遞給free
指針不會實際上是一個那是malloc
編。
2
標準說,你一定要配合完美的分配/釋放功能(new
- delete
,new[]
- delete[]
,malloc
- free
)。理論上,一些編譯器很有可能將operator new()
作爲簡單的malloc()
執行,所以它不會導致崩潰,而是「僅」跳過析構函數調用(這本身很糟糕)。但是,operator[]
可能會在分配的內存塊中存儲元素的數量,在這種情況下,new[]
返回的地址指向由malloc()
(而不是開頭)分配的某個塊內,這意味着您不能使用free()
釋放它。
2
新的操作符也是可重載的。如果有人寫了一個完全不同的新操作符,比如說從內存池中獲取指針,那麼在這些指針上釋放可能是非常危險的。
+1
...在這些指針上調用'free' ... – Potatoswatter 2010-08-17 21:37:55
相關問題
- 1. 可以在動態分配的內存上調用memset導致堆損壞
- 2. 爲什麼堆已損壞?
- 3. 多次調用realloc()似乎會導致堆損壞
- 4. 爲什麼在類對象數組上調用delete而不是delete []會導致堆損壞?
- 5. 堆損壞當刪除指針
- 6. 將結構作爲指針傳遞,導致數組損壞?
- 7. 爲什麼指針不在堆棧上?
- 8. 什麼會導致Windows菜單外觀的損壞?
- 9. DBD :: Oracle導致系統調用損壞?
- 10. 刪除指針對象會損壞堆內存
- 11. 遞增指針,並分配一個新的價值 - 堆棧損壞
- 12. 如何在armv5上調試堆損壞
- 13. 什麼會導致「雙鏈表損壞」錯誤?
- 14. 爲什麼waveOutWrite()會在調試堆中導致異常?
- 15. 此代碼是否會導致託管堆損壞?
- 16. .NET 4:託管代碼是否會導致堆損壞?
- 17. 爲什麼使用指針調用GetWindowRect會導致異常,但地址不是
- 18. gcc,C++:static string member variarible導致堆損壞/分段錯誤
- 19. C - 在指針上使用realloc指針導致分段錯誤
- 20. 爲什麼不使用單位指針會導致分段錯誤?
- 21. 爲什麼這些指針會導致崩潰?
- 22. 爲什麼釋放指針會導致程序中止?
- 23. 這爲什麼會導致空指針異常?
- 24. 這段代碼爲什麼會導致無效指針?
- 25. 爲什麼在循環中調用ReadConsole會破壞堆棧?
- 26. 將值分配給導致崩潰的非靜態函數指針 - 爲什麼?
- 27. C++ - UInt32上的堆損壞*
- 28. 堆棧上的值損壞
- 29. 如何將指針分配給棧上的指針以及堆上的指針?
- 30. 爲什麼調用指令會導致運行時不穩定?
你會得到未定義的行爲,現在和永遠。 [不要這樣做。](http://www.parashift.com/c++-faq-lite/freestore-mgmt.html#faq-16.3) – GManNickG 2010-08-17 18:49:40
他問你爲什麼會這樣做,只是告訴他不要做這無助於他進一步理解任何事情。 – bobDevil 2010-08-17 18:52:16
@bobDevil:好的,C++標準沒有定義這種行爲,這意味着語言實現者不會想要施加合理的行爲。沒有傳統的行爲(除了「不這樣做!」),所以甚至沒有一個非正式的標準。經驗上,這種行爲似乎有所不同。因此,你不能指望任何特定的行爲,也沒有編譯器工程師會給你任何同情。這足以說明「不要這樣做!」而不會解釋爲何發生任何特定行爲。 – 2010-08-17 19:02:30