关于创建对象,有些不明白。(50分)

  • 主题发起人 主题发起人 labafa
  • 开始时间 开始时间
L

labafa

Unregistered / Unconfirmed
GUEST, unregistred user!
以下是我的一段代码,你们觉得这样写可以吗?
我不清楚为什么T := TStringField.Create(Self);可以使用多次?
每一次都创建了一个instance,但都付给了T.
T被多次付值而不需要free,不是create后都要相应free的吗?,它在procedure结束时会释放吗?
谢谢大家指点。
procedure TForm1.Button2Click(Sender: TObject);
var
; T:Tstringfield;
begin
; if table1<>nil then
; ; table1.Free;
; Table1:=Ttable.Create(self);
; table1.Active :=false;
; table1.Databasename :='dbonline';
; table1.TableName :='tel_base_com';
; datasource1.DataSet :=table1;
; T := TStringField.Create(Self);
; T.FieldName := 'tno';
; T.Name := table1.Name + t.FieldName;
; T.Index := 0;
; T.DataSet := table1;
; T := TStringField.Create(Self);
; T.FieldName := 'name1';
; T.Name := table1.Name + t.FieldName;
; T.Index := 0;
; T.DataSet := table1;
; Table1.FieldDefs.UpDate;
; table1.Active :=true;
end;
 
你都知道每建一次就多一個實例,
;T 實際上是一個類指針,
;create時﹐delphi會按類的需要 "新" 開辟一段內存區,并把內存首址賦給 T
這時再調用 T 就等于調用 "新" 開辟的這段內存區﹐就是等于調用一個新的類.

不用手動释放,但不是procedure结束时释放,
而是他的owner會释放他
就是create(self)中的self在free時會释放他
 
不会释放,这样的操作导致了内存泄漏。 T只指向最后一个TStringField,原来创建的对象
无法找到。

过程结束内存不会释放,但Application结后释放。
 
同意》blue_morning
 
但是执行了这段程序后,在与table1相连的dbgrid里显示的是2列,而不是1列。
我在windows任务管理器里看过进程所占的内存,这个过程反复执行多次,内存也没有增加。
 
==> 同意lqy[:D]
 
這樣是不會釋放內存的,因為Form再關閉的時候只能找到
最後一此建立的對象的內存地址,
所以只會釋放最後一次分配的資源,
前邊的會造成內存洩漏
 
会自动释放的。

Create(Self) 时归根结底会调用Self对象的InsertComponent方法,将对前对象
(如StringField)加入Self对象(如Form)的一个Component List里面,在self
对象析构时,会遍历这个List,调用List里每个Component的Free

当然由你自己手动释放也未尝不可。
 
我们不用担心t,t和一个整数型变量没什么区别,在procedure结束后释放。
我们所要关心的是创建的TStringField对象,不过也不用担心,
T.DataSet := table1;已经和table1关联上了,
table1释放的时候,它会释放和它关联的所有TField的。
唯一要关心的是table1,你要记得适当的时候释放它。
 
如果想要手动释放,应该怎样写呢?
 
在formDestroy事件中加入:T.Free;
 
第一个回答的 lqy 就是对的,后面回答的有些是错误的,有些是重复 lqy 的
 
procedure TB.addNew;
var
; tempA: TA;
begin
; tempA := TA.Create; ; ;
; Add(tempA);
end;
//如果执行TB.addNew多次的话,tempA还是无法释放;
 
tempA能不能释放我不管
最上面的TField和TTable都是继承自TComponent,所以 lqy 就是对的
 
实际上Form在关闭的时候会自动的free你建立的所有的对象!
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
940
SUNSTONE的Delphi笔记
S
后退
顶部