加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

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

发布时间:2020-12-15 04:00:59 所属栏目:大数据 来源:网络整理
导读:我一直认为Delphi中的对象实际上是对内存位置的引用,而我认为这些内存存储为指针变量. 现在,我想从一个对象制作一个TValue.考虑一下: TValue.Make(AObject,TypeInfo(TMyObject),val); val:TValue.这不行.实际上,随后使用val将导致访问冲突.但是,如果我们使
我一直认为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期望哪种指针.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读