为什么有时候变量调用Free过程之后还需要使之变成nil呢?
例如很多人动态创建窗口以后,在窗口关闭时,都需要先调用Free过程,然后把窗口变成nil。我想这应该涉及一些基础性原则问题,我基础不太好,想请教大家这个做法有什么用处吗?谢谢。
例如很多人动态创建窗口以后,在窗口关闭时,都需要先调用Free过程,然后把窗口变成nil。我想这应该涉及一些基础性原则问题,我基础不太好,想请教大家这个做法有什么用处吗?谢谢。
当在此使用该变量时可以采用 if sl = NIL then ....
防止错误使用
所以会看到如下的写法
if sl <> NIL then
设为nil是指这个指针无效了,在你再次使用他的时候就有了判断的依据。
将指针赋值为空的好处是很容易判断窗体是否存在或是否被销毁:
楼上的 if form1=nil then 就是这个作用
Delphi里有自带的函数assigned()其同样的作用 if Assigned(form1) then
如果form1为nil则返回false,否则返回true
你察看一下Assigned()的帮助文件,里面说到了为什么free之后还要nil
我以前写C语言时曾经遇到过一个这样的问题:
(前提p,p1是一种类型的指针,分配内存是一样大)我声明了一个指针p, 开僻了一块空间,将此空间地地址赋给p(比如此是地址是123456), 然后用完就释放掉了(注些时p的地址还是123456),此时系统已经把123456地址处的空间收回了。我的程序继向下写又声明了一个指针p2, 为其分配内存,系统很有可能认为123456地址处的空间属于系统,就用了这块空间,此是p2的地址地是123456;接下来程序要用到p1(因种种原因不知道p1已经释放),结果p1指向的是123456(已经属于p2的东西) 最后我的程序交结客户后,姓名的位置显示的信息是“男”
但是如果p释放后直接就赋值为空,那么一量访问就会地址越界,程序不能编译或执行,这样找错,总比程序发布后让人家客户找出来强吧。(因C与Delphi的情况不是完全一样,没有写出实际代码)