我也来提个问,关于List.Pack的问题
delphi吧
全部回复
仅看楼主
level 13
rockmmm 楼主
var
List: TObjectList<TNewObject>;
Obj: TNewObject;
begin
Obj := TNewObject.Create('Three');
List := TObjectList<TNewObject>.Create();
List.Add(TNewObject.Create('One'));
List.Add(Obj);
Obj.free; //手动释放
List.Pack(function(const L, R: TNewObject): Boolean begin result:= L = nil; end) //如何判断L是否释放
List.Free
readln;
end.
2017年02月26日 11点02分 1
level 13
rockmmm 楼主
代码如1楼所示。
本来TObjectList提供删除其中的元素后,自动释放被删除的元素。
但是这个元素一旦在外部被删除,那么List.Free的时候,就会报错。
因此,需要对List进行清理,即Pack,清除为空的元素。
于是就需要在Pack中,定义出什么样的元素是空元素,涉及到对L的判断。
if L = nil then ...
if Not Boolean(L) then ...
if Assigned(L) then ...
这三种办法,都无法判断Obj被Free掉了。。。
求高人指点!
2017年02月26日 11点02分 2
吧务
level 14
既然都用TObjectList了,你就不该在外面释放
2017年02月26日 14点02分 3
为了程序的健壮性考虑嘛,保不齐不小心就在外部释放了[不高兴]
2017年02月27日 07点02分
而且还要考虑可能一个Obj被添加到2个或多个不同的TObjectList中,其中一个List中释放掉Obj,另外的几个List在Free的时候也需要考虑这种问题。
2017年02月27日 07点02分
@rockmmm 那就别用TObjectList,用TList好了。销毁TList前销毁TList里面的对象。
2017年02月27日 08点02分
@rockmmm 还同时添加到不同的list。你这都是什么奇葩用法啊!在外面的时候就不要在list里面。
2017年02月27日 08点02分
level 11
如果非要这样,那就放弃Free,改用函数FreeAndNil吧。
例如:T.Free => FreeAndNil(T)
这样施放的类变量会被置nil,也就可以使用是否=nil来判断了。
2017年02月27日 15点02分 4
外面的是nil了,可他已经放进list的那个指针还是老样子啊[你懂的]
2017年02月27日 23点02分
回复 BambooCaep :这我就没试过了,反正释放objectlist里面的东西就是作死[滑稽][滑稽]
2017年02月28日 03点02分
试过不好用。。。freeandnil后,也不能用=nil来判断
2017年02月28日 16点02分
回复 rockmmm :那我就不知道了[滑稽][滑稽]
2017年02月28日 23点02分
1