2011-11-03 33 views
-1

我有一個包含3個節點指針和2個整數的節點類。我用new分配了所有的節點,但是當我調用delete時,整數被設置爲-17891602,並且它將我代碼的其餘邊界檢查搞砸了。什麼會導致delete這樣做?什麼會導致刪除在我的課的數據字段中留下垃圾值?

+1

你能分享你的代碼嗎? – Avinash

+1

沒有看到一些代碼,很難知道。也許你在析構函數中有一個錯誤? –

+0

爲什麼在你調用'delete'之後檢查內存內容?你不應該這樣做.'delete'不能保證在內存位置寫任何特定的東西。很多刪除的實現都會有意編寫特定的垃圾來幫助檢測錯誤,比如在調用delete之後訪問內存。 –

回答

5

經過delete後,內存不再是你的了。不要檢查它,不要對它做任何事情,因爲如果你這樣做,那麼你有未定義的行爲。它很可能很快就會被重用。

乾杯&心連心,

+0

只需添加,在調試版本中,許多編譯器會故意將垃圾寫入釋放的內存,以便更容易地捕獲您訪問您不應該擁有的內容。 –

+0

在我看來,yemathums在說刪除節點的指針成員會更改整數成員。他沒有檢查刪除的內存(據他所知)。 –

0

檢查指針是否領域也獲得新的價值。它們是否等於0xfeeefeee? (十六進制爲-17891602。)你的內存管理器可能會覆蓋已釋放的內存,所以當你試圖讀取或寫入你不應該訪問的內存時,在崩潰轉儲中更容易識別。

如果您正在閱讀已釋放的對象以進行邊界檢查,那麼您將依賴未定義的行爲。檢查你的環境的文檔,找出它在釋放內存方面做了什麼,如果有的話。你的界限檢查器將需要與它合作;你不能認爲它會在一般情況下工作。

0

如果您在Linux上開發並使用gdb,則可以使用watch命令將觀察點放到GDB。這可以幫助查找何時覆蓋了內存位置。