new 一个是分配地址
a:=@x 也是分配地址

解决方案 »

  1.   

    我随便说几句,希望对你有帮助,不对请指正
      new(a)是给a分配一个地址,就是在内存中找到一块空闲的地址分配给a,如果再用a^:=34,把34这个数写到这块地址中。如果使用a := @x的话,就把a指向另一个地址了,那么在执行dispose(a);的时候就会出错。
      a := @x,程序没有为a开辟新空间,而是使用已有的地址空间,比如a := @x的话直接把a指向内存中的一个地址(这个地址就是保存变量x的地址,已经存在)同时把x赋值给a。所以你如果直接用a^ := x的话(还没有a := @x之前),就会出现访存错误,如果之前已经把a指向一个integer变量的话(比如已经执行a := @x),就不会出错了。  说得很乱,希望你能看明白
      

  2.   

    实际上在2中分配内存也是可以的:var
      x,y:integer;
      a:^integer;
    begin
      new(a);
      x:=34;
      a:=@x;
      y:=a^;
      showmessage(inttostr(y));
    end;但是在调用 a:= @x 后就不能Dispose(a)了,因为a指向的地址已经发生了改变,指向了x
    的地址。
      

  3.   

    to comanche(太可怕):说实话,看了你帖子我很惭愧,因为我的确是个菜鸟,但你也应该很惭愧,这里本来就是大家共同讨论,相互学习的地方,水平难免会有差距,既然是来学习好象还不至于向你那样回答吧,况且这个问题你真不见得能说清楚(真不是瞧不起你),不,说错了,你的确让人瞧不起!
    to others:谢谢大家!
      

  4.   

    TechnoFantasy: 你的回答有些问题,因为你这样做的话,有一块内存(new(a))就悄悄地遗失得无影无踪了,这是所谓的资源泄露。编程中要避免这样的问题。我想你是VB和COM的高手,因为在VB和COM中无须显式释放内存,在Java中也一样。但在Delphi的传统编程中,还是需要显式地释放内存的。由衷之言,希望交个朋友。
      

  5.   

    当然,我的意思不是说我的代码是正确的,实际上如果你定义了 ^integer,那么在new
    的时候会自动分配4字节的空间。实际上上面正确的代码是:var
      x,y:integer;
      a:^integer;
    begin
      new(a);
      x:=34;
      a^:=x;
      y:=a^;
      showmessage(inttostr(y));
      dispose(a);
    end;这个问题:http://www.csdn.net/expert/topic/343/343652.shtm 可能同本贴有相同之处
      

  6.   


    这它妈的和C++是一回事:
    void myFun()
    {int x,y;
     int *a;
     x=34;
     a=new int;
     *a=x;
     y=*a;
     cout<<y<<endl;
    delete a;
    }
    //给你点解释
    1.
    var
      a:^integer;       {在栈内分配内存,指针型a所占的内存大小为4}
    begin
      new(a);           {在堆内分配出一大小为sizeof(integer)其地址赋予a}              
      a^:=34;           {地址为a的内存区域(堆内)被赋予值:34} 
      showmessage(inttostr(a^));
      dispose(a);       {释放在堆内分配的空间,堆内分配的空间不会自动释放}
    end;                {a本身在栈中所占的地盘自动归还,这是栈的特点} 2.
      var
      x,y:integer;     {在栈内分配内存,x,y所占的内存大小为4}
      a:^integer;      {在栈内分配内存,指针型a所占的内存大小为4}
    begin
      x:=34;           {x被赋予值:34}  
      a:=@x;           {a被赋予x的地址,这个地址当然是位于栈内}
      y:=a^;           
      showmessage(inttostr(y));
    end;在1中为什么用new()呢?因为1不像2已经有了一个大小为4的integer整型区域存在(即x)
    怎么办?所以只好自力更生,利用new(a)在堆内分配一个空闲区域,然后再赋给它(堆内)
    34;那位说了,为什么不可以直接a^:=34,看怎么讲了,凡是在栈内分配的内存空间,都是
    随机值的:你不信?
                var
                 i,n:integer;
                begin
                 showmessage(inttostr(i)+'   '+inttostr(n))
                end;
    看它是不是0       0,也就是说a:^integer之后,a并不一定是NIL,而是一值(谁它妈知道),
    所以你搞:a^:=34;我刚才说过,这个语句是给具有地址为a的区域赋值为34,这样可以一些重要的
    区域内容就给你小子改了,所以才new(a)分配一个安全区域。相反dispose(a)就是将a所指的堆内存
    释放,为什么释放?你小子它妈的是个败家子,我不跟你讲了。有兴趣的朋友可以Q我:676795,我对这事贼有兴趣。