我一直认为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期望哪种指针.