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都是怎样工作的,内存上是怎样管理的?
谢谢了!!}
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都是怎样工作的,内存上是怎样管理的?
谢谢了!!}
解决方案 »
- 谁正确编译过源码空间的思微POS系统的请过来一瞧。正确者,另开贴给300分。。。。
- 使用RichEdit控件:
- 各位高手请帮帮我!
- IntraWeb运行在什么WEB服务器的?IIS可以吗?
- 关于文本输入?
- 不想在移动记录时Post,只想在按下某个键时Post,我该怎么办?
- 如何控制tabe1 query1 控件的编缉例如 保存,撤弃象foxpror TABLEUPDATE()函数 or TABLEREVERT()函数,DeLphi有没有缓冲的概念
- 关于在STRINGGRID中的cell中画TDBEIDT控件的问题,高手请进!有原程序
- Form.Create问题:怎样使组件先于Form建立?
- 怎样把_FILETIME和_SYSTEMTIME转化为TDateTime,急!
- 请问关于导入TypeLibrary的问题
- 分太多啦!散掉一些吧(想拿分的快快进来,限时一天结贴,一共散200分)
你这段程序是很不安全的,因为i所指向的内存很可能会被分配给其它程序,就会出错了
var test:TObject;
begin
Test:=TObject.Create
Test.Free;//此时的Free所指向的空间不一定是(void *)0,所以通常情况下,调用了类的析够函数之后,还要手工将他指向nil,这是个好习惯。不过有现成的函数来实现了,FreeAndNil(Test);
end;
你说的FreeAndNil只是针对对象有效,对于Pinteger, PChar这些东西就无效了楼主,这个道理很容易解释。要给我分哦!
那你到是解释啊,光说容易却不解释,故意折磨我啊,你解释了就把分给你。
接着,你给i赋值i^ :=5;的时候这样在这四个字节中就已经存在了5这个值,接着你调用dispose(i);释放i,这个时候编译器只是把i指向的四个字节的内存区域标记为已经释放,但是i仍然是指向这个四字节区域的,并且内部的5并没有改变,如果你下面又申请新的内存区域,比如一个数组(比较大,这样才有可能用到这四个字节的区域)那么windows就会使用掉这个地址了,你再次用i去访问这个地址,内容就不再是5了(当然随机性比较大)正确的方法应该是在Dispose(i)后面加上i :=nil;这样i指向的地址就不存在了,但是原来地址中的内容还是5,需要Windows使用的时候自动去使用这个地址的内容。这么详细你不把分给我,我以后就不回答你的问题了
你现在在qq上吗?我的qq上好象有你吧!你的qq上的名字是什么?最好给号码,谢谢。
你再回答我上面的这个问题就行了。我是onlydelphi