为什么TObjectList <T>.清除不是自由对象?

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)


Dav*_*nan 8

TList<T>.Clear要求DeleteRange做这项工作.DeleteRange围绕调用Notify传递的所有项目的最后一部分cnRemoved.

因此,您对代码的分析是不正确的.该cnRemoved通知正式交付并拥有的对象被释放.

  • EHH.33分钟前我的回答引用你的:"TList <T>中的代码.Clear是骗人的,因为Count实际上是一个属性.看看SetCount(),然后看看DeleteRange(),你会看到在DeleteRange过程结束时Notify(oldItems [i],cnRemoved)的代码." (2认同)