声明为TList但实例化为TObjectList的列表及对象如何释放?
问题解答
当你声明变量为TList但实际创建TObjectList实例时,释放逻辑由实际创建的TObjectList实例决定,而非声明的变量类型:
默认情况下,
TObjectList.Create(无参数)会将OwnsObjects属性设为True,此时调用myList.Free时,TObjectList的析构函数会自动遍历列表中的所有对象,逐个调用它们的Free方法,最后再释放列表自身。这种情况下不需要手动循环释放内部对象。示例代码:
myList.Free; // 自动完成内部对象+列表本身的释放如果你创建实例时指定了
TObjectList.Create(False),此时OwnsObjects为False,TObjectList的行为就和普通TList一致——调用myList.Free只会释放列表本身,不会处理内部对象,这时就需要手动循环逐个释放列表中的对象,再释放列表。示例代码:
var I: Integer; begin for I := 0 to myList.Count - 1 do TObject(myList[I]).Free; // 逐个释放内部对象 myList.Free; // 释放列表本身 end;
注意:即使变量声明是TList,但运行时实例是TObjectList,所以析构时会执行TObjectList.Destroy,遵循TObjectList的释放规则。另外,TObjectList在释放内部对象时会自动检查对象是否为nil,不用担心空指针问题。
内容的提问来源于stack exchange,提问作者I.P.
相关产品推荐
相关产品推荐

