procedure TForm1.Button1Click(Sender: TObject);
var i: ^integer;
begin
  new(i);
  i^ := 5;
  dispose(i);
  Edit1.Text := IntToStr(i^);//显示5
  i^ := 6; // 为什么在dispose(i)之后执行它居然不会报错?
  Edit2.Text := IntToStr(i^);//显示6
end;
{我对指针这块真是搞不懂,为什么执行dispose(i)之后,下面的语句居然还能正常执行并显示正确的结果呢?按理说,在执行dispose(i)之后,i就应该变成值无定义了,可是为什么i^还能指向5?并且5所在的那块内存不是应该被释放了吗?
谁能给我讲讲指针的结构。new,dispose都是怎样工作的,内存上是怎样管理的?
谢谢了!!}

解决方案 »

  1.   

    dispose之后,i并没有被设为nil,需要手动设置。
    你这段程序是很不安全的,因为i所指向的内存很可能会被分配给其它程序,就会出错了
      

  2.   

    To CipherLiu  我的理解是在执行完Dispose(I)后,指针变量的内存已经被释放掉,根本已经不存在这个变量了!!!!想想....
      

  3.   

    调用Dispose(I)之后,指针变量的内存已经被释放掉,但是指针仍然是指针,只不过是一个空指针,它指向的地址是不定的;如果在程序中再度引用的话,系统会将它指向某一块内存,如果指向的内存可用,程序就不会报错;如果指向的内存不能用,系统就会报错,甚至造成系统崩溃。
      

  4.   

    To Wyb716  指针变量的内存都被释放掉了,已经不存在这个变量了,当然也就没有了这个变量中包含的指针内容!空指针的概念和这个是不一样的,如果我们为一个指针变量分配了空间后它的指针内容可能就是空的。既然这个时候已经调用Dispose释放了指针变量所占据的内存空间,那么这个指针所指的内容虽然存在于内存中,但指向这个内容的指针变量已经少了一个(可能有其他变量存在!!!!)。所以说,我认为你的解释不对....  继续关注....
      

  5.   

    用对象据个例子。
    var test:TObject;
    begin
     Test:=TObject.Create
     Test.Free;//此时的Free所指向的空间不一定是(void *)0,所以通常情况下,调用了类的析够函数之后,还要手工将他指向nil,这是个好习惯。不过有现成的函数来实现了,FreeAndNil(Test);
    end;
      

  6.   

    我比较同意wyb716(小刀)的说法,但又觉得FrameSniper(寻找告别单身的机会!) 说的有道理,不过用freeandnil释放对象是绝对没有错的
      

  7.   

    to: microjuz(天才弟弟) 
    你说的FreeAndNil只是针对对象有效,对于Pinteger, PChar这些东西就无效了楼主,这个道理很容易解释。要给我分哦!
      

  8.   

    Pinteger是什么类型,请详细解释,我是菜鸟。谢谢to:Linux2001(我想买手提电脑啊!)
    那你到是解释啊,光说容易却不解释,故意折磨我啊,你解释了就把分给你。
      

  9.   

    首先使用New(i)的时候开辟了一个4字节的内存区域给i,i指向这个内存地址。
    接着,你给i赋值i^ :=5;的时候这样在这四个字节中就已经存在了5这个值,接着你调用dispose(i);释放i,这个时候编译器只是把i指向的四个字节的内存区域标记为已经释放,但是i仍然是指向这个四字节区域的,并且内部的5并没有改变,如果你下面又申请新的内存区域,比如一个数组(比较大,这样才有可能用到这四个字节的区域)那么windows就会使用掉这个地址了,你再次用i去访问这个地址,内容就不再是5了(当然随机性比较大)正确的方法应该是在Dispose(i)后面加上i :=nil;这样i指向的地址就不存在了,但是原来地址中的内容还是5,需要Windows使用的时候自动去使用这个地址的内容。这么详细你不把分给我,我以后就不回答你的问题了
      

  10.   

    PInteger就是:^integer但是用Pinteger比较规范和容易理解!你急什么啊,没有看见我打了这么多字进去啊
      

  11.   

    to:Linux2001(我想买手提电脑啊!)
    你现在在qq上吗?我的qq上好象有你吧!你的qq上的名字是什么?最好给号码,谢谢。
      

  12.   

    to:Linux2001(我想买手提电脑啊!)
    你再回答我上面的这个问题就行了。我是onlydelphi