1、类的成员函数并不需要Create来分配资源,对象不必创建就可以使用函数;成员函数不属于某个对象,而属于类
2、对象声明时初始化为nil,Free后只是释放了资源,并没有把nil赋给对象,所以我们常在对象Free后,把nil赋给它
3、必须C.Free,c:=nil
4、C1、C2指向同一个地址,不过这涉及到引用计数,你可以做个试验看看C2所引用的内容有没存在

解决方案 »

  1.   

    1、aa方法只能是静态方法,编译的时候就联入了。方法实现时不能对数据域操作,因为没有分配空间
    2、free掉的是分配的内存空间,但c是指针变量,仍指向那块内存空间
    3、不会释放实例,只是把指针移走了;这样做c原来指向的实例就游离了
    4、是指针指向一个地址了(c1),c2原来指向的实例游离了;c1c2指向的对象是同一个,当然free了
      

  2.   

    1、因为在AA函数里没有用到任何变量,因此我认为优化编译时,它被认为是static的函数。即没有类的实例,就可以调用的。所有类的实例都共享这个函数。如果另外任意编写一个函数,例如
        TC=Class
        public
          a: Integer;
          Procedure AA;
        end;procedure TC.AA;
    begin
    ShowMEssage(IntTOStr(a));
    end;
    这时就不可以了。
    2、当C.Free时,它所占的内存地址释放了,但C它表示的是个地址的值,是不会变的。你可以调用FreeAndNil(C)将C置为NIL。
    3、C:=NIL,不会释放内存的,会产生内存泄露。需要用FreeAndNil(C)
    4、两个指向同一个地址了。C1 Free了以后,C1和C2共同指向的那块内存地址就释放了,但这并不是指C1和C2的值等于nil了。
      

  3.   

    我刚做了试验 4、C1、C2同时FREE
    保罗回答得更好,呵呵