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

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

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

回答

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

也就是说,从字面上看,是TObjectListover的唯一最具定义性的特征,比如说, a TListTObjectList有一个OwnsObjects属性,默认为 true。根据文档:

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

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

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

  • 设置OwnsObjects为假。

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

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

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

我不知道您正在阅读什么文档,但上面的引文摘自TObjectList的文档,它清楚地说明了与您所声称的相反。


以上是Delphi在TObjectList<T>上调用.Clear对包含的对象调用析构函数的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>