作者ric2k1 (Ric)
看板EE_DSnP
标题Re: [公告] HW#4 Reference Code 的更正
时间Mon Dec 11 12:16:21 2006
※ 引述《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