作者ric2k1 (Ric)
看板EE_DSnP
标题Re: [问题] hw4 new []的传回值问题
时间Sun Dec 3 11:14:58 2006
※ 引述《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)