Delphi在TObjectList<T>上调用.Clear对包含的对象调用析构函数
我有一个项目,其中有一个包含 TObjectList 的模型类。当我使用 clear 函数清空列表时,列表包含一组计算对象,然后我对对象执行一些操作(我将对象引用到其他类字段)。但是当我调用 clear 函数时,我可以看到使用调试器在列表中的对象上调用了 Destroy 函数,从而导致访问冲突。
从 delphi 文档中,它指出 Clear 函数不应尝试释放对象,但它看起来好像确实调用了销毁/解构。
回答
当我调用 clear 函数时,我可以看到使用调试器对列表中的对象调用了 Destroy 函数
也就是说,从字面上看,是TObjectListover的唯一最具定义性的特征,比如说, a TList。 TObjectList有一个OwnsObjects属性,默认为 true。根据文档:
http://docwiki.embarcadero.com/Libraries/en/System.Contnrs.TObjectList
使用
TObjectList存储和维护的对象的列表。TObjectList提供用于添加、删除、重新排列、定位、访问和排序对象的属性和方法。如果该OwnsObjects属性设置为 true(默认值),则TObjectList控制其对象的内存,在重新分配索引时释放对象;当它从列表中使用Delete、Remove、 或Clear方法删除时;或者当TObjectList实例本身被销毁时。
因此,如果您需要在从列表中删除对象后继续访问它们,则可以:
-
设置
OwnsObjects为假。 -
使用该
TObjectList.Extract()方法删除单个对象而不释放它们。 -
不要使用破坏对象的容器。
从 delphi 文档中,它指出 Clear 函数不应尝试释放对象,但它看起来好像确实调用了销毁/解构。
我不知道您正在阅读什么文档,但上面的引文摘自TObjectList的文档,它清楚地说明了与您所声称的相反。