var
  x:integer;
  p:^integer;
begin
  x:=20;
  new(p);
  p:=@x;
  if p<>nil then
    showmessage(IntToStr(p^));
  dispose(p);
end;运行出现“Invalid pointer operation”
当将p:=@x改为p^:=20就可以了。为什么p:=@x时,使用dispose(p)是错误的,如何改正。

解决方案 »

  1.   

    new(p)已经分配了空间,p的指向已经确定,p^是给p指向的内容赋值
      

  2.   

    程序里有个错误,New(p)以后p已经指向新分配的空间,再把它指向x,那块空间泄漏
    dispose出错的原因是x是一个整型变量,它的空间是在栈上分配的,在每次调用这个函数的时候语言进行空间分配,在返回时自动释放的。把p指向这个栈空间的一个值后dispose,因为这段地址不应该由程序中的代码进行分配,所以出错
      

  3.   

    用p:=@x时
    dispose(p);实际上是释放x所占用的内存。由于x并不是在堆上分配的内存,所以释放该内存会出错,同时会出现内存泄漏,即new(p)所申请的内存没有释放。用p^:=20时,即真正地将p指向的内容赋值。而dispose(p);则是将该内存释放,因此是正确的。