C_and_CPP 版 (精华区)
发信人: seaboy (毕设,咋办?), 信区: C_and_CPP
标 题: Re: 请教一下内存分配程序中一个问题!
发信站: 哈工大紫丁香 (Mon May 2 22:05:14 2005), 转信
这个函数的策略是,总是多分配一个int放在新申请空间的最前面。
新申请空间的指针指向这个int后的紧邻位置。
看看你的问题:
free(&(((cntr*)oldmem)[-1]))
除掉了free和其两个括号,一层层向外拨:
&(((cntr*)oldmem)[-1]); //cntr是int类型;
(&(((int*)oldmem)[-1]); //(int*)是个强制类型转换;
&((int*)[-1]); //(int*)[-1]就是内存中地址减去1,跟(int*)[1]一个意思。
&(int*); //这里就明白了吧?
还一句:
oldmem=(T*)&(((cntr*)m)[1]); //同样道理,错开存放此段内存大小的域。
PS to will :
T* t;
t[m]即使T定义了operator[],这里返回的也是内存中自t始第m个T,而不是t->[].
【 在 CaoWindows (linux) 的大作中提到: 】
: 这个函数可以分配新的空间,也可以调整已分配的空间大小
: template <typename 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);
: oldcount=*(cntr*)p;
: }
: T* m=(T*)realloc(p,elems*tsz+csz);
: *((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]);
: ~~~~~~~~~??
: }
:
: template <typename T>
: inline void freemem(T* m){getmem(m,0);}
--
才知道
原来
自己需要的是
100万
份勇气。。。
※ 修改:·seaboy 于 May 2 22:07:50 修改本文·[FROM: 202.118.229.106]
※ 来源:·哈工大紫丁香 bbs.hit.edu.cn·[FROM: 202.118.229.106]
Powered by KBS BBS 2.0 (http://dev.kcn.cn)
页面执行时间:5.491毫秒