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)是错误的,如何改正。
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)是错误的,如何改正。
解决方案 »
- 为什么启动windows版的apache的过程中,我加载的project.so写了三次文件?
- 如何判断Tedit中的内容是否已经全部被选中(全部变蓝色)
- 用TBlobField写Oracle8i的BLOB类型的字段时碰到“致命”的错误!!!
- 如何让listview自动转到值为listview1.Items[i].Caption=Edit1.Text且被选中
- 在sql存储过程中,怎么循环访问表的每一条记录并修改?
- 请问怎么安装控件包?
- 哥哥姐姐们,那里有delphi下载,别告诉borland有
- 这个问题很急,请高手近来侃侃!
- 数据的批量传输问题。
- 如何创建一个word 文件?和msword.documents.open不是一回事吧?
- 为什么我的DELPHI里没有controbar控件
- 急!在线等待,有没有TREEVIEW添加,删除,修改的源码?使修改后的结果返回到数据库中!
dispose出错的原因是x是一个整型变量,它的空间是在栈上分配的,在每次调用这个函数的时候语言进行空间分配,在返回时自动释放的。把p指向这个栈空间的一个值后dispose,因为这段地址不应该由程序中的代码进行分配,所以出错
dispose(p);实际上是释放x所占用的内存。由于x并不是在堆上分配的内存,所以释放该内存会出错,同时会出现内存泄漏,即new(p)所申请的内存没有释放。用p^:=20时,即真正地将p指向的内容赋值。而dispose(p);则是将该内存释放,因此是正确的。