有关TList的问题(100分)

  • 主题发起人 主题发起人 zwjChina
  • 开始时间 开始时间
Z

zwjChina

Unregistered / Unconfirmed
GUEST, unregistred user!
看了看VCL中TList的代码,发现TList的析构函数没有inherited Destroy,代码如下:
destructor TList.Destroy;
begin
Clear;
end;
那么是否我自己继承自TObject的类的析构函数中可以不用调用inherited
那么是否意味着destructor这个关键字就已经实现了对象的释放,否则
Create了,却仅仅Clear, 难到不会产生内存泄露吗?
 
要看 clear 中做了什么。
肯定不对
那要看 Clear 具体做了什么,方法的名称不是主要的,主要是它完成的功能。
 
其实应该是没必要继承了
Clear是完成清除功能,会把列表中的各项所占的内存释放
既然内存都释放了,还要继承什么呢?
 
你的解释我觉得不够,就TObject继承类的创建是一定要Create的,
Create负责为对象分配一定的空间,释放时怎么能不释放掉由Create分配的空间呢!
 
在Delphi当中析构函数只是做你自己清理工作的地方,它不会涉及到具体对象内存的分配与释放。
说的更深入一点,你看看Free方法的源码。
procedure TObject.Free;
asm
TEST EAX,EAX
JE @@exit
MOV ECX,[EAX]
MOV DL,1
CALL dword ptr [ECX].vmtDestroy
@@exit:
end;
它会判断要释放的对象是不是等于nil,如果不是的话,那么调用虚表的-4个字节的vmtDestroy来做清理工作,而在vmtDestroy所指向的方法中会动调用你的Destroy方法,在调用完你的Destroy方法之后再做对象内存的清理工作.
 
看看tobject.destroy 怎么实现的:
[red]destructor TObject.Destroy;
begin
end;[/red]
呵呵,什么都没作,有必要inherited它吗?
正如liguang所说的那样,你调用free后一些释放内存之类的基本操作
已经由编译器替你做了.如果你在对象的创建或其他过程中创建了其他的对象or
分配了内存,那你才需要在destrory过程中手动释放它们.
 
多人接受答案了。
 
后退
顶部