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

Cri*_*ica 0 delphi variables pointers delphi-xe2

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

var test_form :Tform;
    p: Pointer;
vartest := Tform.create(nil);
p:=@vartest;
Run Code Online (Sandbox Code Playgroud)

如果在运行时我只有p 可以释放vartest吗?

Dav*_*nan 6

指针p指向TObject变量.也就是说,p是指向对象引用的指针.因此,您需要取消引用p.像这样:p^.因为p是未键入的,所以在调用Free方法之前需要先将其强制转换.

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

TObject(p^).Free;
Run Code Online (Sandbox Code Playgroud)

但这不会修改vartest变量.它只会破坏物体.如果你想设置vartestnil还有那么你可以做这样的:

FreeAndNil(p^);
Run Code Online (Sandbox Code Playgroud)

FreeAndNil是一个奇怪的野兽,因为它需要一个未键入的参数.这就是你不需要施展的原因TObject.

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


Arn*_*hez 5

你只需要指定指针的类型,p: ^TObject而不是写p: pointer,因此:

var test_form :Tform;
    p: ^TObject;

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

....
p^.Free;
Run Code Online (Sandbox Code Playgroud)

然后,您可以使用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;
Run Code Online (Sandbox Code Playgroud)

当然,使用TObjectList这里可能是自然的方式,但这显示了pointer< - > TObject类型转换的真实用例.