jpf*_*ius 6 delphi generics collections delphi-xe
我刚才注意到了
var
ObjList : TObjectList <TMyObject>;
...
ObjList := TObjectList <TMyObject>.Create (True);
ObjList.Add (TMyObject.Create);
ObjList.Clear;
Run Code Online (Sandbox Code Playgroud)
不释放对象.查看源代码,似乎没有cnRemoved触发通知Clear(继承自TList <T>).
我的问题:这是故意的吗?有没有理由为什么人们不想在这种情况下收到这些通知Clear?或者这可以被视为集合类中的错误?
编辑
事实证明,我把线放了
inherited Create;
Run Code Online (Sandbox Code Playgroud)
在TMyObject析构函数的顶部,它应该进入构造函数.这就是为什么我报告的内存泄漏看起来像是TObjectList没有释放物品.看看来源说服了我(我被Count财产困住了).还是要谢谢你的帮助!
Cos*_*und 16
该列表在您调用时释放拥有的对象.Clear.你有一个测试错误.下面的代码示例,在Delphi XE上编写,显示如下:
Calling CLEAR
Object deleted.
Object deleted.
After CLEAR. Press ENTER to free L and Exit.
Run Code Online (Sandbox Code Playgroud)
代码在TList<T>.Clear欺骗,因为Count它实际上是一个属性.看看SetCount(),然后看看,DeleteRange()你会Notify(oldItems[i], cnRemoved)在DeleteRange程序结束时看到代码.
program Project3;
{$APPTYPE CONSOLE}
uses SysUtils, Generics.Collections;
type
TDelObject = class
public
destructor Destroy;override;
end;
{ TDelObject }
destructor TDelObject.Destroy;
begin
WriteLn('Object deleted.');
inherited;
end;
var L:TObjectList<TDelObject>;
begin
L := TObjectList<TDelObject>.Create(True);
L.Add(TDelObject.Create);
L.Add(TDelObject.Create);
WriteLn('Calling CLEAR');
L.Clear;
WriteLn('After CLEAR. Press ENTER to free L and Exit.');
Readln;
L.Free;
end.
Run Code Online (Sandbox Code Playgroud)
TList<T>.Clear要求DeleteRange做这项工作.DeleteRange围绕调用Notify传递的所有项目的最后一部分cnRemoved.
因此,您对代码的分析是不正确的.该cnRemoved通知正式交付并拥有的对象被释放.