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中,对象复制的原理是什么?
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中,对象复制的原理是什么?
這樣就比較安全,要不,就要在 try except中保護了,你這樣的代碼,可能會有內存泄露!!!
TMyClass1.Create(3,4); 沒有釋放!!
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
aobj2 := TMyClass1.Create(3,4);
aobj1 := aobj2; //##
aobj1.Free;
aobj2.Free;aobj1和aobj2用的是一个内存空间
当然只要释放一个就可以了
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的地址并不相同呀?
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;