var
  aobj1,aobj2:TMyClass1;
  P1,P2:TPointer;
begin
  aobj1 := TMyClass1.Create(1,2);
  aobj2 := TMyClass1.Create(3,4);
  aobj1 := aobj2;  //##
  aobj1.Free;
  aobj2.Free;
end;
//////////////////////////////////////////////////////////////////
问什么经过aobj1 := aobj2;后,就不能释放了,也就是说,如果没有aobj1 := aobj2;程序没有任何问题,但是aobj1.Free ;  aobj2.Free;只保留一个,也没有问题,问题处在什么地方,或者说,在delphi中,对象复制的原理是什么?

解决方案 »

  1.   

    你可用 FreeAndNil(aobj1);...
    這樣就比較安全,要不,就要在 try except中保護了,你這樣的代碼,可能會有內存泄露!!!
    TMyClass1.Create(3,4); 沒有釋放!!
      

  2.   

    对象复制的原理是什么?传递指针。下面是我的测试代码:
      TmyClass = class
      end;var
      Form1: TForm1;implementation{$R *.dfm}procedure TForm1.Button1Click(Sender: TObject);
    var
      m1, m2: TmyCLass;
    begin
      m1 := TmyCLass.Create;
      m2 := TmyCLass.Create;
      memo1.Lines.clear;
      memo1.Lines.add('m1:'+ IntToStr(integer(m1)));
      memo1.Lines.add('m2:'+ IntToStr(integer(m2)));
      memo1.Lines.add('--------------------');
      m1 := m2;
      memo1.Lines.add('m1:'+ IntToStr(integer(m1)));
      memo1.Lines.add('m2:'+ IntToStr(integer(m2)));
      //m1.Free;
      m2.Free;end;运行结果:
    memo1里面的内容:m1:13450172
    m2:13450184
    --------------------
    m1:13450184
    m2:13450184
      

  3.   

    aobj1 := TMyClass1.Create(1,2);
      aobj2 := TMyClass1.Create(3,4);
      aobj1 := aobj2;  //##
      aobj1.Free;
      aobj2.Free;aobj1和aobj2用的是一个内存空间
    当然只要释放一个就可以了
      

  4.   

    procedure TForm1.Button1Click(Sender: TObject);
    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;end;
    为什么ShowMessage('对象aobj1,aobj2的地址相同');从来不执行,也就是说,aobj1,aobj2的地址并不相同呀?
      

  5.   

    procedure TForm1.Button1Click(Sender: TObject);
    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;