我有一个存储指向某些对象的指针的数组,我想知道如果你只有一个指针,是否可以释放一个对象。 例如:
var test_form :Tform;
p: Pointer;
vartest := Tform.create(nil);
p:=@vartest;
如果在运行时我只有 p 可以免费 vartest ?
答案 0 :(得分:6)
指针p
指向TObject
变量。也就是说,p
是指向对象引用的指针。因此,您需要取消引用p
。像这样:p^
。因为p
是未键入的,所以您需要在调用Free方法之前将其强制转换。
所以,把它放在一起,就可以释放这样的对象:
TObject(p^).Free;
但这不会修改vartest
变量。它只会破坏物体。如果您想将vartest
设置为nil
,那么您可以这样做:
FreeAndNil(p^);
FreeAndNil
是一个奇怪的野兽,因为它需要一个未键入的参数。这就是为什么你不需要转换为TObject
。
为了避免所有这些转换,最好将p声明为类型指针,例如^TObject
或^TForm
。
答案 1 :(得分:5)
你只需要指定指针的类型,写p: ^TObject
而不是p: pointer
,如下:
var test_form :Tform;
p: ^TObject;
vartest := Tform.create(nil);
p:=@vartest;
....
p^.Free;
然后,您可以使用p^
取消引用指针并使用指向对象实例。
关于指针的一般建议:使用指针时,最好不要使用泛型pointer
类型(除非它是强制性的),而是使用强类型的指针(如{{1大多数代码中的所有p: ^TObject
类型):您的代码将更容易编码和调试。
但请确保您的列表存储指向对象的指针,而不是对象本身。
大多数情况下,列表存储对象引用自己。在这种情况下,只需将P* = ^T*
转换为pointer
。
TObject
当然,在这里使用var L: TList;
i: integer;
L := TList.Create;
try
L.Add(TObject.Create); // create an instance and add to the list
...
finally
for i := 0 to L.Count-1 do
TObject(L[0]).Free; // typecast to TObject and free the instance
L.Free; // free the list
end;
可能是这样做的自然方式,但这显示了TObjectList
< - >的真实用例。 pointer
类型转换。