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;是没什么实现代码的,请问创建和释放对象,到底是个怎么样的过程呢?
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;是没什么实现代码的,请问创建和释放对象,到底是个怎么样的过程呢?
这样在创建实例和释放实例的时候,会自动调用。
Tobj=class(Tobject)
A:string;
p:pchar; end; constructor TObject.Create;
begin
p:=new(pchar);
end; destructor TObject.Destroy;
begin
dispose(p);
end;
用到内存分配才需要释放
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
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;
比如我定义了
DataList : TStringList;
DataList := TStringList.Create;
在窗体关闭或者程序结束的时候
我就这样写
if DataList <> nil then
begin
DataList := nil ;
DataList.Free;
end;
有CREATE和DESTROY就够了
DataList.clear;
DataList.free;
DataList:=nil;但是如果datalist里放了对象,就需要通过遍历的办法释放每一个对象。
freeandnil(DataList);
但是如果datalist里放了对象,就需要通过遍历的办法释放每一个对象。
>>如果是存放对象就用tobjectlist