精華區beta EE_DSnP 關於我們 聯絡資訊
※ 引述《Jyou (徵跟我一樣窮的人)》之銘言: : 依照hw4的reference code : 和老師測試的程式結果 : 對於new []的function : 例如他allocate 到0x89b9c30 的記憶體 : 會顯示出 >> : Memory acquired... 0x89b9c30 : return address = 0x89b9c34 : 所以我們return 0x89b9c34的位置回去 : 然而問題發生了 : 我猜reference code意思是說 : system 會把array_size存在 0x89b9c30~0x89b9c33的4個byte裡面 : 所以我們必須return 0x89b9c34的address : 然而經過我熬夜嘗試的結果orz : system實際上會自動再+4個byte... : 所以array_size會存在 0x89b9c34~0x89b9c37的4個byte : 然後vector __arrList裡存入的位置是0x89b9c38!! 可利用的大小剩8bytes.. : 簡單來說 new []這個function 應該是return acquired的memory address回去就好 : system 會自動+4個byte... : 還是...code的意思是只是cout << 0x89b9c34 : 但實際上還是return 0x89b9c30回去Orz.... : 對了 : 在call delete []時...pointer也會自動減4個byte.. : 所以如果是在new 時 return 0x89b9c30回去的話( : (_vector __arrList會存入 0x89b9c34) : 那Calling free...( 0x89b9c30 ) ...會顯示這樣的結果.. : 換言之 應該不是顯示出 0x89b9c34... : 而如果照refernce code return 0x89b9c34 回去會顯示正確 : 但我覺得這應該是bug...因為這樣一來記憶體空間會被再吃掉4 bytes.. : (因為 _arrList會存入 0x89b9c38) 你說的沒錯 是應該 return 0x89b9c30... 我只是想 print out 0x89b9c34 來顯示 _arrList 存的 address... 不過 reference code 那樣寫真的是很欠打, 害你熬夜找出這個問題真的是很抱歉 Orz 我想 reference code 應該將這段 code 刪掉 --- [刪掉] // TODO #ifdef MEM_DEBUG cout << ">> return address = " << ret << endl; #endif // MEM_DEBUG return ret; 而直接 "return getMem(t);" 就好了... 畢竟在 MemMgr::allocArr() 裡面花力氣印出這個東西好像沒有什麼必要... (要印應該在 MemTest::newArrs() 裡面印, 不過算了...) 其實另外一個 reference code "newOp.cpp" (in <classWebSite>/refSrc/lec07) 有寫的很清楚 return 的 address 是 alloc 的 address, 然後 compiler 自動會加 4 準備 reference code 的時候一定腦殘了... XD : 不過顯示出來都沒什麼差啦...|| : 只是單純覺得好像有點問題 : 講的不清楚的話請見諒Orz -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 59.121.131.15 ※ 編輯: ric2k1 來自: 59.121.131.15 (12/03 11:26) ※ 編輯: ric2k1 來自: 59.121.131.15 (12/03 11:31)