如果只有一个指针,则释放一个对象

时间:2012-09-04 07:11:23

标签: delphi variables pointers delphi-xe2

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

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

如果在运行时我只有 p 可以免费 vartest

2 个答案:

答案 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类型转换。