我有一个存储指向某些对象的指针的数组,我想知道如果你只有一个指向它的指针,是否可以释放一个对象。例如:
var test_form :Tform;
p: Pointer;
vartest := Tform.create(nil);
p:=@vartest;
如果在运行时我只有p 是否可以释放vartest?
我有一个存储指向某些对象的指针的数组,我想知道如果你只有一个指向它的指针,是否可以释放一个对象。例如:
var test_form :Tform;
p: Pointer;
vartest := Tform.create(nil);
p:=@vartest;
如果在运行时我只有p 是否可以释放vartest?
指针p指向一个TObject变量。也就是说,p是一个指向对象引用的指针。因此,您需要取消引用p. 像这样:p^。因为p它是无类型的,所以您需要在调用 Free 方法之前对其进行转换。
所以,把它放在一起,你可以像这样释放对象:
TObject(p^).Free;
不过,这不会修改vartest变量。它只会破坏对象。如果您也想设置vartest为nil,那么您可以这样做:
FreeAndNil(p^);
FreeAndNil是一个奇怪的野兽,因为它需要一个无类型的参数。这就是为什么您不需要强制转换为TObject.
为了避免所有这些转换,最好将 p 声明为类型化指针,例如^TObjector ^TForm。
您只需要指定指针的类型,p: ^TObject而不是p: pointer,如下所示:
var test_form :Tform;
p: ^TObject;
vartest := Tform.create(nil);
p:=@vartest;
....
p^.Free;
然后您可以使用p^取消引用指针并使用指向对象实例。
关于指针的一般建议:使用指针时,最好不要使用泛型pointer类型(除非它是强制性的),而是使用强类型的指针(就像大多数代码中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这里使用 a 可能是自然的做法,但这显示了pointer<->TObject类型转换的真实用例。