Delphi 调用 .Clear 对 TObjectList<T> 调用包含对象的析构函数

Posted

技术标签:

【中文标题】Delphi 调用 .Clear 对 TObjectList<T> 调用包含对象的析构函数【英文标题】:Delphi Calling .Clear on a TObjectList<T> calls destructor on contained objects 【发布时间】:2021-06-30 08:55:22 【问题描述】:

我有一个项目,其中有一个包含 TObjectList 的模型类。当我使用 clear 函数清空列表时,列表包含一组计算对象,然后对对象进行一些操作(我将对象引用到其他类字段)。但是当我调用 clear 函数时,我可以使用调试器看到在列表中的对象上调用了 Destroy 函数,从而创建了访问冲突。

从 delphi 文档中,它指出 Clear 函数不应该尝试释放对象,但它看起来好像确实调用了销毁/解构。

【问题讨论】:

您查看过 TObjectList.OwnsObjects 属性吗?默认情况下它是真的。 【参考方案1】:

当我调用 clear 函数时,我可以使用调试器看到在列表中的对象上调用了 Destroy 函数

也就是说,从字面上看,TObjectList 的一个最具定义性的特征比TList 更重要。 TObjectList 有一个 OwnsObjects 属性,默认为 true。根据文档:

http://docwiki.embarcadero.com/Libraries/en/System.Contnrs.TObjectList

使用TObjectList 存储和维护对象列表。 TObjectList 提供属性和方法来添加、删除、重新排列、定位、访问和排序对象。如果OwnsObjects 属性设置为true(默认),TObjectList 控制其对象的内存,在重新分配对象索引时释放对象; 使用DeleteRemoveClear 方法将其从列表中删除时;或者当 TObjectList 实例本身被销毁时。

因此,如果您需要在从列表中删除对象后继续访问它们,那么:

OwnsObjects 设置为 false。

使用TObjectList.Extract() 方法删除单个对象而不释放它们。

不要使用破坏对象的容器。

从 delphi 文档中,它指出 Clear 函数不应该尝试释放对象,但它看起来好像确实调用了销毁/解构。

我不知道您正在阅读什么文档,但上面的引用摘自 TObjectList 的文档,它显然与您声称的相反。

【讨论】:

以上是关于Delphi 调用 .Clear 对 TObjectList<T> 调用包含对象的析构函数的主要内容,如果未能解决你的问题,请参考以下文章

Delphi中的Sender:TObject对象解析

那位大侠教教我。delphi怎么调用sql 还有就是直接调用sql的存储过程

delphi 中用数组作为参数传入sql语句中

在delphi 7中如何写多行sql语句?

delphi中使用sql 语句进行日期比较有问题

delphi出现EAccessViolation 的错误