※ 引述《ric2k1 (Ric)》之銘言:
==== Post 263 ====
: 在RecycleList的destructor裡面看到 reset();
: 但是reset() 裡面又有 delete toDel;
: 那這樣會不會是無窮迴圈阿= =a
: 從頭影片上看來
: 似乎reset都是在delete他們包住的東西
: 好像沒看到會delete自己這個class的
你說的沒錯, 我的確是寫錯了... :P
這樣寫雖然不會造成無窮回圈, 但是會有 doubly freeing memory 的問題...
MemRecycleList<T>::reset() 應改成 ---
void reset() {
if (_nextList) delete _nextList;
_first = 0; _nextList = 0;
}
由於發現的比較晚, 我們的測資將會避開這個部份...
==== Post 227 ====
: 依照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 應該將這段 code 刪掉 ---
[刪掉]
// TODO
#ifdef MEM_DEBUG
cout << ">> return address = " << ret << endl;
#endif // MEM_DEBUG
return ret;
而直接 "return getMem(t);" 就好了...
畢竟在 MemMgr::allocArr() 裡面花力氣印出這個東西好像沒有什麼必要...
(要印應該在 MemTest::newArrs() 裡面印, 不過算了...)
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 59.121.131.15
※ 編輯: ric2k1 來自: 59.121.131.15 (12/03 11:28)
※ 編輯: ric2k1 來自: 59.121.131.15 (12/03 11:32)
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 140.112.21.240