释放了没?

noall 2003-05-22 12:50:03
tClOb=class(tpersistent)
private
Fmc:string;
published
property mc:string Read Fmc write Fmc;
end;

procedure DoOne;
var tob:tclob;
begin
a:=tlist.create;
tob:=tclob.create;
tob.mc:='一类材料';
a.add(tob);
tob:=tclob.create;
tob.mc:='二类材料';
a.add(tob);

a.free;//这样释放的话,a中的tob有没被释放吗??
end;
...全文
38 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
myling 2003-05-26
  • 打赏
  • 举报
回复
所以 ,楼主其实是你没明白我的意思
myling 2003-05-26
  • 打赏
  • 举报
回复
看add的实现

function TList.Add(Item: Pointer): Integer;
begin
Result := FCount;
if Result = FCapacity then
Grow;
FList^[Result] := Item;
Inc(FCount);
if Item <> nil then
Notify(Item, lnAdded);
end;

会发现实际上加的是一个指针
所以释放a的时候,只是将指针释放了

真正分配内存的是这句tob2:=tclob.create;

换句话说,“A中所增加的tclob实例”这句话就不对,
a中并没有增加tclob的实例!因为它与上面定义的实例用的同一块内存!
myling 2003-05-26
  • 打赏
  • 举报
回复
测试一下
procedure DoOne;
var tob1,tob2:tclob;
begin
a:=tlist.create;
tob1:=tclob.create;
tob1.mc:='一类材料';
a.add(tob1);
tob2:=tclob.create;
tob2.mc:='二类材料';
a.add(tob2);

a.free;//这样释放的话,a中的tob有没被释放吗??

showmessage(tob1.mc);
showmessage(tob2.mc);
end;

确实没释放



outer2000 2003-05-24
  • 打赏
  • 举报
回复
A中所增加的tclob实例是否也释放了?
我想是没有释放掉;
noall 2003-05-24
  • 打赏
  • 举报
回复
呵: myling(阿德) 应该明白我的意思吧

a中的tob? 这个说法就不对吧?

确实,free a后,a中的所有也都释放了,但是tob还是存在的呀

中a.free后,A中所增加的tclob实例是否也释放了?
swayi21 2003-05-22
  • 打赏
  • 举报
回复
FreeAndNil
jjpan 2003-05-22
  • 打赏
  • 举报
回复
释放了
myling 2003-05-22
  • 打赏
  • 举报
回复
tClOb=class(tpersistent)
private
Fmc:string;
published
property mc:string Read Fmc write Fmc;
end;

procedure DoOne;
var tob:tclob;
begin
a:=tlist.create;
tob:=tclob.create;
tob.mc:='一类材料';
a.add(tob);
tob:=tclob.create;
tob.mc:='二类材料';
a.add(tob);

a.free;//这样释放的话,a中的tob有没被释放吗??
end;


a中的tob? 这个说法就不对吧?

确实,free a后,a中的所有也都释放了,但是tob还是存在的呀
jjpan 2003-05-22
  • 打赏
  • 举报
回复
procedure TForm1.FormButton1Click(Sender: TObject);


type


PMyList = ^AList;


AList = record


I: Integer;


C: Char;


end;


var


MyList: TList;


ARecord: PMyList;


B: Byte;


Y: Word;


begin


MyList := TList.Create;


New(ARecord);


ARecord^.I := 100;


ARecord^.C := 'Z';


MyList.Add(ARecord); //加入一个100的整数和Z字符


New(ARecord);


ARecord^.I := 200;


ARecord^.C := 'X';


MyList.Add(ARecord); //加入一个200的整数和X字符


Y := 10;


for B := 0 to (MyList.Count - 1) do


begin


ARecord := MyList.Items[B];


Canvas.TextOut(10

Y

IntToStr(ARecord^.I));


Y := Y + 30;


Canvas.TextOut(10

Y

ARecord^.C);


Y := Y + 30;


end;


for B := 0 to (MyList.Count - 1) do


begin


ARecord := MyList.Items[B];


Dispose(ARecord);


end;


MyList.Free;


end;
参考
geodgehoul 2003-05-22
  • 打赏
  • 举报
回复
我测试的没有释放啊 ,
如果用freeandnil 的则是把tob的指针设为空,会不会泄漏啊?

5,391

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧