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
控制其对象的内存,在重新分配对象索引时释放对象; 使用Delete
、Remove
或Clear
方法将其从列表中删除时;或者当TObjectList
实例本身被销毁时。
因此,如果您需要在从列表中删除对象后继续访问它们,那么:
将 OwnsObjects
设置为 false。
使用TObjectList.Extract()
方法删除单个对象而不释放它们。
不要使用破坏对象的容器。
从 delphi 文档中,它指出 Clear 函数不应该尝试释放对象,但它看起来好像确实调用了销毁/解构。
我不知道您正在阅读什么文档,但上面的引用摘自 TObjectList
的文档,它显然与您声称的相反。
【讨论】:
以上是关于Delphi 调用 .Clear 对 TObjectList<T> 调用包含对象的析构函数的主要内容,如果未能解决你的问题,请参考以下文章