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吗?
指针p指向TObject变量.也就是说,p是指向对象引用的指针.因此,您需要取消引用p.像这样:p^.因为p是未键入的,所以在调用Free方法之前需要先将其强制转换.
所以,把它放在一起,你可以释放这样的对象:
TObject(p^).Free;
Run Code Online (Sandbox Code Playgroud)
但这不会修改vartest变量.它只会破坏物体.如果你想设置vartest到nil还有那么你可以做这样的:
FreeAndNil(p^);
Run Code Online (Sandbox Code Playgroud)
FreeAndNil是一个奇怪的野兽,因为它需要一个未键入的参数.这就是你不需要施展的原因TObject.
为了避免所有这些转换,最好将p声明为类型指针,例如^TObject或^TForm.
你只需要指定指针的类型,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*类型):你的代码会很多更容易编码和调试.
但请确保您的列表存储指针对象,而不是对象本身.
大多数情况下,列表存储对象引用自己.在这种情况下,就强制转换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;
Run Code Online (Sandbox Code Playgroud)
当然,使用TObjectList这里可能是自然的方式,但这显示了pointer< - > TObject类型转换的真实用例.
| 归档时间: |
|
| 查看次数: |
3308 次 |
| 最近记录: |