为什么有时候变量调用Free过程之后还需要使之变成nil呢?
例如很多人动态创建窗口以后,在窗口关闭时,都需要先调用Free过程,然后把窗口变成nil。我想这应该涉及一些基础性原则问题,我基础不太好,想请教大家这个做法有什么用处吗?谢谢。

解决方案 »

  1.   

    这是一个好的习惯。
    当在此使用该变量时可以采用 if sl = NIL then ....
      

  2.   

    可以通过nil判断对象是否存在
    防止错误使用
    所以会看到如下的写法
    if sl <> NIL then
      

  3.   

    其实你称他为变量有点笼统,如果你称他为指针就很容易明白了。
    设为nil是指这个指针无效了,在你再次使用他的时候就有了判断的依据。
      

  4.   

    就窗体而言,每个窗体都对应一个指针。form1.free的作用是将窗体的资源释放掉,但指针仍然指向这个空的窗体结构。而form1:=nil是将其指针赋值为空。
    将指针赋值为空的好处是很容易判断窗体是否存在或是否被销毁:
    楼上的 if form1=nil then 就是这个作用
    Delphi里有自带的函数assigned()其同样的作用 if Assigned(form1) then 
    如果form1为nil则返回false,否则返回true
    你察看一下Assigned()的帮助文件,里面说到了为什么free之后还要nil
      

  5.   

    一是习惯问题,再就是为了查错的方便!
    我以前写C语言时曾经遇到过一个这样的问题:
    (前提p,p1是一种类型的指针,分配内存是一样大)我声明了一个指针p,  开僻了一块空间,将此空间地地址赋给p(比如此是地址是123456),  然后用完就释放掉了(注些时p的地址还是123456),此时系统已经把123456地址处的空间收回了。我的程序继向下写又声明了一个指针p2, 为其分配内存,系统很有可能认为123456地址处的空间属于系统,就用了这块空间,此是p2的地址地是123456;接下来程序要用到p1(因种种原因不知道p1已经释放),结果p1指向的是123456(已经属于p2的东西)  最后我的程序交结客户后,姓名的位置显示的信息是“男”
    但是如果p释放后直接就赋值为空,那么一量访问就会地址越界,程序不能编译或执行,这样找错,总比程序发布后让人家客户找出来强吧。(因C与Delphi的情况不是完全一样,没有写出实际代码)