易码技术论坛

 找回密码
 加入易码
搜索
查看: 241309|回复: 13

[LAVA]动态内存分配与删除new和delete

[复制链接]
发表于 2006-2-9 16:27:00 | 显示全部楼层
怎么这个文章好像有点眼熟?

不是原创吧~好像……
发表于 2006-2-9 16:30:00 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
 楼主| 发表于 2006-2-9 16:30:00 | 显示全部楼层
我对Lava不很熟,当然不是原创拉


发表于 2006-2-9 16:32:00 | 显示全部楼层
    建议斑竹将帖子转到C语言专区啊[em01]
发表于 2006-2-9 16:36:00 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
发表于 2006-2-9 16:41:00 | 显示全部楼层
ED一族 也许是WW,就是从C区里扒拉的这个文章~
发表于 2006-2-9 16:47:00 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
发表于 2006-2-9 18:43:00 | 显示全部楼层
这个很早了!

不要再发了!
发表于 2006-2-10 13:33:00 | 显示全部楼层
是我写的 楼主不讲究 请著名来源!!
发表于 2006-2-10 13:35:00 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
发表于 2006-2-10 13:37:00 | 显示全部楼层
楼上的强...........猛
 楼主| 发表于 2006-2-10 13:55:00 | 显示全部楼层
对不起哈,我是有这习惯。 此文转自laugj
发表于 2006-2-11 10:48:00 | 显示全部楼层
不应该说转自 我 应该说转自哪个论坛  文章这玩意发出来了 就等于奉献给了大家  这帖emsky有的了拉 就不要转了 所以不要乱转帖啊 看好了在转 有些老帖你觉的好呢 就顶一下拉....
 楼主| 发表于 2006-2-9 16:18:43 | 显示全部楼层 |阅读模式
其实早就研究出来了,可是考虑到~~可能不太稳定,最近测试了一下处理少量的数组还算速度~


#define _DEBUG 1



#define K_UP 20
#define K_DOWN 21
#define K_RIGHT 22
#define K_LEFT 23
#define K_ENTER 13
#define K_ESC 27
#define K_PAGEUP 19
#define K_PAGEDOWN 14
#define K_DEBUG 'd'


#define DYNAMIC_RAM_LEN 16384 //可以自己改,这值是我的引擎中设定的



char dynamic_ram[DYNAMIC_RAM_LEN];


int dynamic_len;


void hex(char c,int adr)
{
  int _a,_b;
  _a=c/16;
  _b=c%16;
  if(_a<10) _a=_a+48; else _a=_a+87;
  if(_b<10) _b=_b+48; else _b=_b+87;
  *adr=_a;*(adr+1)=_b;
}
void _debug()
{
  char s[5];
  long base;
  char _c;
  int _y,_x;
  memset(s,0,5);
  base=0x2000;
  SetScreen(1);
  for(;;)
  {
   for(_y=0;_y<6;_y++)
   {
    for(_x=0;_x<8;_x++)
    {
     hex(*(base+_y*8+_x),_TEXT+_x*2+_y*26);
     *(_TEXT+_x+16+_y*26)=*(base+_y*8+_x);
    }
   }
   UpdateLCD(0);
   _c=getchar();
   if(_c==K_UP) base=base-8;
   if(_c==K_DOWN) base=base+8;
   if(_c==K_LEFT) base=base-48;
   if(_c==K_RIGHT) base=base+48;
   if(_c==K_PAGEDOWN) base=base+256;
   if(_c==K_PAGEUP) base=base-256;
   if(_c=='i') base=base-4096;
   if(_c=='k') base=base+4096;
   if(_c==32) {hex(base/256,s);hex(base%256,s+2);TextOut(4,4,s,0x40);Box(3,4,28,14,0,1); getchar();}
  }
}
void error(int e,int class,int reason)
{
SetScreen(1);
printf("引擎出错:\n错误:%s\n  种类:%s\n原因:%s\n热键退出!",e,class,reason);
for(;;)
{
  if(getchar()==K_DEBUG&&_DEBUG==1) _debug();
}
}
/********/


void w_int(int p,int v)
{
if(p<0x19c0||p>0x7fff) error("写数据错误","非法地址","程序bug或资源文件错误");
*(p+1)=(v&0xff00)>>8;
*(p)=(v&0x00ff);
}


int _int(int p)
{
return (*(p+1)<<8)|*(p);
}


void new(int p,int len)
{
if(dynamic_len+len+4>DYNAMIC_RAM_LEN) error("动态分配内存","内存不足","程序规划错误或资源文件参数错误");
w_int(p,dynamic_len+dynamic_ram+4);
w_int(dynamic_len+dynamic_ram,p);
w_int(dynamic_len+dynamic_ram+2,len);
dynamic_len=dynamic_len+len+4;
}


void delete(int p)
{
int len;
int i;
if(_int(p)==0) return;
if(_int(p)<dynamic_ram||_int(p)>=dynamic_ram+DYNAMIC_RAM_LEN) error("动态删除内存","指针范围出错","程序规划错误.");
if(_int(_int(p)-4)!=p) error("动态删除内存","指针校验出错","程序归划错误");
len=_int(_int(p)-2);
i=_int(p)-4;
i=i+_int(i+2)+4;
while(i!=dynamic_len+dynamic_ram)
{
  w_int(_int(i),_int(_int(i))-4-len);
  i=i+_int(i+2)+4;
}
memcpy(_int(p)-4,_int(p)+len,DYNAMIC_RAM_LEN-_int(p)-len);
dynamic_len=dynamic_len-len-4;
w_int(p,0);
}
/********/



使用是需要先将指针定义为全局变量或是main中的变量


使用new的方法:new(&指针,数组长度);


这时指针会指像分配好的内存地址上


使用delete的方法:delete(&指针);


这时会删除指针所值的内存地址并将指针的值改为0,但不清0数据区的数据


delete删除未事先定义的指针时会报错!


您需要登录后才可以回帖 登录 | 加入易码

本版积分规则

Archiver|手机版|小黑屋|EMAX Studio

GMT+8, 2025-5-4 08:46 , Processed in 0.014117 second(s), 18 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表