getmem

在c++stl程序媛开发指南上看到一个getmem的例子

template <class T> 
void getmem(T*& oldmem,int elems)
{
typedef int cntr;
const int csz = sizeof(cntr);
const int tsz = sizeof(T);
if (elems == 0)
{
free(&(((cntr*)oldmem)[-1]));
return;
}
T* p = oldmem;
cntr oldcount = 0;

if(p)
{
cntr* tmp = reinterpret_cast<cntr*>(p);
p = reinterpret_cast<T*>(--tmp);//向后移4位
oldcount = *(cntr*)p;
}
T*m = (T*)realloc(p,elems*tsz+csz);
if(m == 0)
{
cout << "ERROR!"<<endl;
exit(1);
}
*((cntr*)m) = elems;
const cntr increment = elems - oldcount;
if(increment > 0)
{
long startadr = (long)&(m[oldcount]);
startadr += csz;
memset((void*)startadr,0,increment*tsz);


}
oldmem = (T*)&(((cntr*)m)[1]);
}


中间的free(&(((cntr*)oldmem)[-1])) 乍一看是内存访问越界啊  太明显了  识字的人都看出来  那肯定人家写的对,我没明白为什么这样写而已。忽然怀疑自己是不是连数组都不懂,下标为-1的时候表示的不仅仅是访问数组开始的前一个内存,慌啊。。赶紧上网查啊    


还是csdn上有个人提问 下面有个高手解答了。其实是没真正看懂程序的缘故,只揪着其中的这句话不放。通读程序,只要发现getmem返回的并不是realloc之后的内存的首地址,而是第二个地址就能理解为什么free(&(((cntr*)oldmem)[-1]))没有访问越界了。而且下标为-1好像就只能是访问数组头的前一个地址

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值