procedure FreeListObjects( l : TStrings);
var i : integer;
BEGIN
FOR i := 0 TO l.Count -1 DO BEGIN
l.Objects[i].Free;
l.Objects[i] := NIL;
END;
end;
PROCEDURE StringListAdd;
VAR i : INTEGER; Code : LONGWORD;
BEGIN
l := Classes.TstringLIST.CREATE;
FOR i := 0 TO 4 DO BEGIN
Code := i ;
l.AddObject('', TObject(code));
END;
Code := LONGWORD(l.Objects[2]);
FreeListObjects(l);
l.Free;
END;
Run Code Online (Sandbox Code Playgroud)
当我l.OwnsObjects := TRUE 不 使用时FreeListObjects(l),会发生错误.
谁来释放这个字符串列表的对象?
你告诉字符串列表它拥有Objects数组中的对象.在这种情况下,它会Free在您销毁列表时自动调用所有这些值,就像您的FreeListObjects代码一样.
但那里没有物品!您已经获取了Integer不是对象的值,并对它们进行了类型化以强制它们进入TObject.你不能调用Free上Integer,但在任何代码调用点Free,它不知道原始类型的值.当你进行类型转换时,你告诉编译器你知道你在做什么,并且编译器相信你.如果你真的不知道自己在做什么,请不要输入.
你说你没有错误FreeListObjects,但你应该也得到错误使用 FreeListObjects.问题是你正在调用Free一些不是对象的东西.无论您是使用自己的代码调用它还是让库调用它都无关紧要.
您可能花了一些时间使用C#.在该语言中,整数被自动"加框"成为真正的对象.这不是Win32 Delphi的工作原理.德尔福不打拳击取消装箱.