很简单的 OOP问题(Destroy函数)!请兄弟帮忙! ( 积分: 0 )

  • 主题发起人 主题发起人 czj_earth
  • 开始时间 开始时间
C

czj_earth

Unregistered / Unconfirmed
GUEST, unregistred user!
自定义类:
type
TMyCalss = class(TObject)
SList: TStringList;
constructor Create

destructor destroy;
end;

constructor TMyClass.Create;
begin
SList:= TStringList.Create;
end;

destructor TMyClass.Destroy
begin
if sList <> nil then
sList.Free;
end;

//调用该类
var
myClass: TMyClass;
begin
myClass:= TMyClass.Create;
try
...;
finally
myClass.Free;
end;
end;
问:
为什么在调用myClass.Free;后并不执行 TMyClass.Destroy?
我应该在那里释放 sList呢?
TMyClass.Destroy析构函数有什么作用呢?
 
自定义类:
type
TMyCalss = class(TObject)
SList: TStringList;
constructor Create

destructor destroy;
end;

constructor TMyClass.Create;
begin
SList:= TStringList.Create;
end;

destructor TMyClass.Destroy
begin
if sList <> nil then
sList.Free;
end;

//调用该类
var
myClass: TMyClass;
begin
myClass:= TMyClass.Create;
try
...;
finally
myClass.Free;
end;
end;
问:
为什么在调用myClass.Free;后并不执行 TMyClass.Destroy?
我应该在那里释放 sList呢?
TMyClass.Destroy析构函数有什么作用呢?
 
TMyCalss = class(TObject)
SList: TStringList;
constructor Create

destructor destroy
override;
end;

destructor TMyClass.Destroy
begin
if sList <> nil then
sList.Free;
inherited;
end;
 
明白,
谢谢!
 
inherited 在create里面也应该写吧?
 
学习一下~~~
 
析构函数都需要加override声明;

在析构对象的时候,应该调用对象的Free()方法而不是直接调用Destroy()。
这是因为,在TObject的Free()方法中会判断对象本身是否为nil,如果不为nil则调用对象的Destroy(),以增加安全性。既然有这样更安全的做法,当然没有理由不这么做了。

与构造函数类似,如果在类中没有特殊的资源需要被释放,也可以不定义析构函数,TObject同样定义了一个空的析构函数。

要销毁一个对象,其顺序与创建对象正好相反,
这里sList是自定义的,所以就应该在Destroy里释放
 
constructor TMyClass.Create;
begin
inherited;
.........//你创建的控件和处理的事情,和Destroy函数刚刚相反
end;
 
var
myClass: TMyClass;
begin
myClass:= TMyClass.Create;
try
...;
finally
myClass.Destroy;
end;
end;
 
同意逝风,
析构函数都需要加override声明;
 
谢谢各位
 
后退
顶部