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毫秒