这样可以释放内存吗?(10分)

  • 主题发起人 主题发起人 DiamondKing
  • 开始时间 开始时间
D

DiamondKing

Unregistered / Unconfirmed
GUEST, unregistred user!
在程序设计中,创建了一个TList ,用来存放一组指向地址结构的指针,
但在释放的时候碰到一个很奇怪的问题。
// AddrList :TList 创建部分以及插入操作均省略
//以下为清空AddrList的代码
var
i:integer;
begin
//ShowMessage(inttostr(AddrList.count));
for i:=0 to AddrList.Count-1 do
begin
// Showmessage(inttostr(i));
Dispose(AddrList.Items);
AddrList.Delete(i);
end;
----------------------------------------
发现Addrlist 种共有7个元素,但循环进行到i=4的时候就报错,“List index out of
bounds (4).
TList有个clear 方法,它可以清除Tlist的列,但它可以回收分配的内存吗?

 
倒过来写就对了
for i:= AddrList.Count-1 downto 0 do
begin
// Showmessage(inttostr(i));
Dispose(AddrList.Items);
AddrList.Delete(i);
end;

如果item是对象的话就用
Txx(AddrList.Items).Free,而不用dispose
 
你delete一个以后,TList的count就少了啦!呵呵
 
Adnil:为什么要倒过来写呢?我测试了一下通过了。
Tlist里面的元素是怎么存放的?是不是创建它的实例的时候,只是通过某个属性标识了它的
首地址?
我查到下面一段代码 //*onlines:Tlist
while (onlines.count>0) do
begin
dispose(OnLines.first);
onlines.Delete(0);
end;
Onlines.free;

它也可以执行的很顺利。为什么呢?


 
to DiamondKing:
前面几位DFW已经说的很清楚了呀!
比如原来有:
List.Items[0] A
List.Items[1] B
List.Items[2] C
List.Items[3] D
List.Items[4] E
List.Items[6] F
List.Items[7] G
当你用for i:=0 to AddrList.Count-1 do
时删除了List.Items[0],也就是A,这时List.Items[0]就变成B啦:
List.Items[0] B
List.Items[1] C
List.Items[2] D
List.Items[3] E
List.Items[4] F
List.Items[6] G

>>循环进行到i=4的时候
就变成:
List.Items[0] D
List.Items[1] E
List.Items[2] F
List.Items[3] G


 
呵呵,如果用for语句,得倒过来del。
当然,如果用楼上的whild也可以啊。
因为如果用for的话。每del一个,list的items就少了一个,
那么,当你的i大于items的数目,当然会出错了。[:D]
 
list.clear;
list.free;
 
哦哦哦哦哦哦哦!原来如此!
 
后退
顶部