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(引用)的位置在堆栈上. 通常这并不重要,因为编译器知道何时取消引用以及何时不引用. 在TValue.Make的情况下,该函数采用指针. >当您指定Make(O …时,编译器将强制转换对指针的引用(指向堆栈). 所以你必须在这种情况下给编译器一个提示,因为它不知道TValue.Make期望哪种指针. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |