我有一个存储指向某些对象的指针的数组,我想知道如果你只有一个指向它的指针,是否可以释放一个对象。例如:
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 声明为类型化指针,例如^TObject
or ^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
类型转换的真实用例。