0

我有一个存储指向某些对象的指针的数组,我想知道如果你只有一个指向它的指针,是否可以释放一个对象。例如:

var test_form :Tform;
    p: Pointer;
vartest := Tform.create(nil);
p:=@vartest;

如果在运行时我只有p 是否可以释放vartest

4

2 回答 2

6

指针p指向一个TObject变量。也就是说,p是一个指向对象引用的指针。因此,您需要取消引用p. 像这样:p^。因为p它是无类型的,所以您需要在调用 Free 方法之前对其进行转换。

所以,把它放在一起,你可以像这样释放对象:

TObject(p^).Free;

不过,这不会修改vartest变量。它只会破坏对象。如果您也想设置vartestnil,那么您可以这样做:

FreeAndNil(p^);

FreeAndNil是一个奇怪的野兽,因为它需要一个无类型的参数。这就是为什么您不需要强制转换为TObject.

为了避免所有这些转换,最好将 p 声明为类型化指针,例如^TObjector ^TForm

于 2012-09-04T07:25:44.607 回答
5

您只需要指定指针的类型,p: ^TObject而不是p: pointer,如下所示:

var test_form :Tform;
    p: ^TObject;

vartest := Tform.create(nil);
p:=@vartest;

....
p^.Free;

然后您可以使用p^取消引用指针并使用指向对象实例。

关于指针的一般建议:使用指针时,最好不要使用泛型pointer类型(除非它是强制性的),而是使用强类型的指针(就像大多数代码中p: ^TObject的所有P* = ^T*类型一样):你的代码会很多更容易编码和调试。

但请确保您的列表存储对象的指针,而不是对象本身。

大多数时候,列表存储对象引用自己。在这种情况下,只需将类型转换pointerTObject.

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类型转换的真实用例。

于 2012-09-04T07:26:11.927 回答