type
  Tobj=class(Tobject)
     A:string;
  end;var
  obj:Tobj;
begin
  obj:=Tobj.create;
  obj.A:='aaa';
  obj.free;
end;对象创建和释放,我看了Tobject里的create和free定义:
constructor TObject.Create;
begin
end;destructor TObject.Destroy;
begin
end;procedure TObject.Free;
begin
  if Self <> nil then
    Destroy;
end;是没什么实现代码的,请问创建和释放对象,到底是个怎么样的过程呢?

解决方案 »

  1.   

    正常来说,如果自己写类,只要写自己的constructor和destructor就行了。
    这样在创建实例和释放实例的时候,会自动调用。
      

  2.   

    type 
      Tobj=class(Tobject) 
        A:string; 
        p:pchar;  end; constructor TObject.Create; 
    begin
      p:=new(pchar); 
    end; destructor TObject.Destroy; 
    begin 
     dispose(p);
    end; 
    用到内存分配才需要释放
      

  3.   

    我没仔细看TObject代码,它的创建和释放过程没有代码,是因为它通过它的一个子类实现的
      

  4.   


    class function TObject.NewInstance: TObject;
    begin
      Result := InitInstance(_GetMem(InstanceSize));
    end;function _GetMem(Size: Integer): Pointer;
    {$IF Defined(DEBUG) and Defined(LINUX)}
    var
      Signature: PLongInt;
    {$IFEND}
    begin
      if Size > 0 then
      begin
    {$IF Defined(DEBUG) and Defined(LINUX)}
        Signature := PLongInt(MemoryManager.GetMem(Size + 4));
        if Signature = nil then
          Error(reOutOfMemory);
        Signature^ := 0;
        Result := Pointer(LongInt(Signature) + 4);
    {$ELSE}
        Result := MemoryManager.GetMem(Size);
        if Result = nil then
          Error(reOutOfMemory);
    {$IFEND}
      end
      else
        Result := nil;
    end;MemoryManager.GetMem的实现见GetMem.INC
      

  5.   

    释放用到的是_FreeMem方法,与上述类似!
      

  6.   

    var   
          aobj1,aobj2:TMyClass1;   
          P1,P2:TPointer;   
      begin   
        
          aobj1   :=   TMyClass1.Create(1,2);   
          aobj2   :=   TMyClass1.Create(3,4);   
          aobj1   :=   aobj2;   
          P1   :=   @aobj1;   
          P2   :=   @aobj2;   
          if   P1   =   P2   then   
              ShowMessage('对象aobj1,aobj2的地址相同');   
          aobj1.Free;   
          aobj2.Free;   
          end;   
      

  7.   

    建议你看下《VCL架构剖析》中的"vcl的诞生与设计原理",里面讲得挺详细的。
      

  8.   

    4楼正解,对象内存分配是在NewInstance进行。打开CPU WINDOW跟踪一下,就可以大致了解对象创建的过程了。
      

  9.   

    我是这样做的
    比如我定义了
    DataList : TStringList;
    DataList := TStringList.Create;
    在窗体关闭或者程序结束的时候
    我就这样写
    if DataList  <> nil then 
      begin
        DataList := nil ;
        DataList.Free;
      end; 
      

  10.   

    FREEANDNIL(对象)没有FREE方法,
    有CREATE和DESTROY就够了
      

  11.   


    DataList.clear;
    DataList.free;
    DataList:=nil;但是如果datalist里放了对象,就需要通过遍历的办法释放每一个对象。
      

  12.   


    freeandnil(DataList); 
    但是如果datalist里放了对象,就需要通过遍历的办法释放每一个对象。
    >>如果是存放对象就用tobjectlist