摘自:http://topic.csdn.net/t/20030917/09/2268057.html
问题描述:
动态创建form常碰到一个问题就是必须在创建之前判断form是否已经存在,通常第一次创建的时候form肯定为nil,但是当使用完毕之后如果
form.free后,form肯定不是nil,必须在form关闭之后在他的主调用form中动态freeandnil(form),或者form.free;form.nil;才能变成nil
我想知道有没有办法当form.free之后,form指针并不是nil的时候来判断form是否已经被free过了,是否能够正常创建一个新的对象。
这个问题困扰了很久了!
个人感觉楼上各位的方法根本没有针对楼主的问题啊!
当申明一个Form1的时候,只是在栈上创建一个四个字节的内存空间。直到调用构造器的时候才真正跑到堆上分配对象实际内存空间,也只有到了这个
时候,前面分配的四个字节的对象指针的内容才有意义!
当我们释放了Form1的时候,如果不释放栈上的对象指针,就会形成一个野指针,如果对野指针进行操作,马上就会出现一个AV访问错误....楼主的意
思,我想就是在不释放对象指针的情况下去判断当前对象指针指向的对象是否还存在!个人认为没有任何现成的方法可以进行这种判断!
如果使用Release、Free或Action:=caFree等方法将窗体释放掉后,此时窗体指针内容并不改变,这个时候用Assigned来判断虽然也可以判断窗体对
象指针有意义,但实际窗体是根本不存在的!
FrameSniper兄,我想知道的就是这个,难道没有任何办法可以判断一个指针的地址是否真的有效吗?经常碰到这个问题,通常都要很严格的控制一个
指针free后必须nil,或者读取指针的某一个属性来判断有效性,感觉这个办法很笨,感觉肯定有一些好的办法,等到这个问题解决了在接贴吧!
注明:
代码例子如下:
有form1,form2 ,form1打开form2,关闭form2的时候,不释放对象,即不执行Release,那么如下代码,在第2次打开form2的时候,会报错;
if assigned(form2) then
begin
// form2.Free; //--如果form2已经被release后,这步就会报内存访问错误了;
form2 := nil; //--如果没有第一步的free,则将指针置空后,那对象还在堆里,没有被释放掉;
end;
if not Assigned(Application.FindComponent( 'Form2')) then
begin
Form2 := TForm2.Create(Application);
end;
Form2.Show;
-------------------------------------------------------------
正确例子应该是这样:
form2关闭时,要执行release,释放掉对象;
然后在打开form2的时候,以下代码就可以了;
if not Assigned(Application.FindComponent( 'Form2')) then
begin
Form2 := TForm2.Create(Application);
end;
Form2.Show;