gpt4 book ai didi

delphi - 为什么 TObjectList.Clear 不释放对象?

转载 作者:行者123 更新时间:2023-12-03 14:55:15 24 4
gpt4 key购买 nike

我刚刚注意到

var
ObjList : TObjectList <TMyObject>;
...
ObjList := TObjectList <TMyObject>.Create (True);
ObjList.Add (TMyObject.Create);
ObjList.Clear;

不释放该对象。看源码好像没有cnRemoved通知在 Clear 中触发(继承自 TList <T> )。

我的问题:这是故意的吗?在 Clear 的情况下,是否有任何原因让人们不想收到这些通知? ?或者这可以被视为集合类中的错误吗?

编辑

结果是我把这条线放了

inherited Create;

TMyObject 的顶部析构函数,它应该进入构造函数。这就是为什么我收到内存泄漏报告,看起来像 TObjectList没有释放这些元素。看了一下源代码,我就相信了(我被 Count 属性困住了)。不管怎样,感谢您的帮助!

最佳答案

当您调用 .Clear 时,列表会释放拥有的对象。 。您遇到了测试错误。下面的代码示例是在 Delphi XE 上编写的,显示了以下内容:

Calling CLEAR
Object deleted.
Object deleted.
After CLEAR. Press ENTER to free L and Exit.
<小时/>

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.

关于delphi - 为什么 TObjectList<T>.Clear 不释放对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6518012/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com