delphi – 为什么TValue.Make需要指向对象引用的指针?

前端之家收集整理的这篇文章主要介绍了delphi – 为什么TValue.Make需要指向对象引用的指针?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我一直认为Delphi中的对象实际上是对内存位置的引用,而我认为这些内存存储为指针变量.

现在,我想从一个对象制作一个TValue.考虑一下:

TValue.Make(AObject,TypeInfo(TMyObject),val);

val:TValue.这不行.实际上,随后使用val将导致访问冲突.但是,如果我们使用address-of运算符,如下所示:

TValue.Make(@AObject,val);

一切都很好.对我来说,这是出乎意料的,因为我认为AObject(引擎盖下)实际上是一个指针.我错了,或者这是TValue.Make方法的怪癖?有人可以赐教吗?

解决方法

@H_404_15@
procedure Foo;
var
  I: Integer; // value type
  O: TObject; // reference type
begin
  @I; // Get a pointer to I
  O := TObject.Create;
  @O; // Get a pointer to the memory "behind" the reference O
end;

>位置@I以及O(引用)的位置在堆栈上.
>另一方面,@ O的位置在堆上.

通常这并不重要,因为编译器知道何时取消引用以及何时不引用.

在TValue.Make的情况下,该函数采用指针.

>当您指定Make(O …时,编译器将强制转换对指针的引用(指向堆栈).
>当您指定Make(@O …时,编译器将首先取消引用,然后创建指向堆上位置的指针.

所以你必须在这种情况下给编译器一个提示,因为它不知道TValue.Make期望哪种指针.

猜你在找的Delphi相关文章