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

我一直认为Delphi中的对象实际上是对内存位置的引用,而我认为这些内存存储为指针变量.

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

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

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

TValue.Make(@AObject,val);

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

解决方法

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 API HOOK完全说明》这篇文章,基本上都...
  从网上看到《Delphi API HOOK完全说明》这篇文章,基本上...
ffmpeg 是一套强大的开源的多媒体库 一般都是用 c/c+&#x...
32位CPU所含有的寄存器有:4个数据寄存器(EAX、EBX、ECX和ED...
1 mov dst, src dst是目的操作数,src是源操作数,指令实现的...