我认为Delphi真正的对象在哪里,或者对象的起始地址是多少,我实在没法知道的!
如果诸位可以找到对象真正地址请告知我,谢谢!说明如下:设有如下类定义:
TMyClass = Class(TObject)
public
Value: Integer;
end;定义:
Var
MyClass: TMyClass; MyClass 其实是一个指针, TMyClass.Create返回对象真正的地址
执行MyClass := TMyClass.Create;后,MyClass指针指向一个对象 而@MyClass得到的只是MyClass指针变量的地址,而对象的地址无法得到 我没有求过@TMyClass.Create,也许能得到一个地址,请继续讨论,谢谢
如果诸位可以找到对象真正地址请告知我,谢谢!说明如下:设有如下类定义:
TMyClass = Class(TObject)
public
Value: Integer;
end;定义:
Var
MyClass: TMyClass; MyClass 其实是一个指针, TMyClass.Create返回对象真正的地址
执行MyClass := TMyClass.Create;后,MyClass指针指向一个对象 而@MyClass得到的只是MyClass指针变量的地址,而对象的地址无法得到 我没有求过@TMyClass.Create,也许能得到一个地址,请继续讨论,谢谢
解决方案 »
- 请问string转换为pchar的内幕(如buf:=PChar(str)),是内存复制,还是指针引用?
- dbexpress保持连接的假死状态
- 为什么我关闭A窗口去刷新B窗口的Adoquery时,数据更新不了,是不是存在什么缓存问题?
- 如何复制TADODataSet数据集到另一个TADODataSet数据集?
- 没分继续骂!
- 模式子对话框的父窗口怎么找?
- 关于WritePrivateProfileString的问题,请指教!!!
- DBGrid新增的字段的编辑问题??
- 请高手看一下,下面的代码什么意思
- 请问如何让元件在执行中象在设计中一样自由拖放与移动
- PB 本地数据库文件如何访问.
- 如何让flash控件右幾彈出自己的菜單
如果将TMyClass.Create翻译成汇编的话,应该是call [TMyClass]
其实就是将IP指向TMyClass.Create的地址,你可以通过这个时候的寄存器的值获得上面的问题?
A := TClass.Create();
A.X:=100;
B := A;
B.X := 101;此时A.X 的值是多少?答案是101;因此A和B是同一个对象
如@A,@B是对象地址的话?那么@B=@A,事实是@B<>@A, 而Pointer(A) = Pointer(B);
所以Pointer(A) Pointer(B).才是对象的地址
而把MyClass看成一个指针,MyClass变量的内容看成是TMyClass.Create创建对象的地址当然这种看法是不一定正确,
@TMyClass.Create的值是函数的地址,而不是新创建对象的地址
public
Value: Integer;
end;
PMyClass: ^TMyClass;var MyClass: TMyClass;
PClass: PMyClass;
MyClass := TMyClass.Create;观点有三个:
1.MyClass是一个指针,但不是PMyClass类型;
2.MyClass变量的值是Pointer(MyClass),是一个32位地址
3.Pointer(MyClass)是TMyClass.Create创建对象的起始地址 4.关于PMyClass类型的意义,我暂时还无法准确说明,
大概意义是: PMyClass类型变量,指向一个MyClass之类的变量
不管怎么结果是下正确的
PClass指向MyClass,则PClass的值是@MyClass,也就是说Pointer(PClass) = @MyClass
Obj:TObject;
begin
Obj:=TObject.Create;
Format('对象指针在栈上地址:%s',[Integer(Addr(Obj))]);
Format('对象实体在堆上地址:%s',[Integer(Pointer(Obj))]);
//对象指针的释放形式隐含了^操作符....
end;
@Node = $12F544
Pointer(Node) = $12F68C
Addr(Node) = $12F544能不能帮我解释一下,上面三个值的意义?
Format('对象实体在堆上地址:%s',[Integer(Pointer(Obj))]);这样我就明白了,
@Obj = Addr(Obj),意义相同对吗?
假设有指针如下
var
P:Pointer;
我通过这个指针访问的时候应该是这样的P^,其实对象指针也一样,按照常规,我们在使用Obj这个对象指针的时候也应该使用Obj^,但由于Object Pascal对纯Pascal进行了扩充,所以这里不再需要^,而直接使用旧可以了,从这个意义上说Obj本身就代表一个指针释放,释放的结果就是Obj这个对象指针变量中包含的指针,而这个指针就是对象实体在堆上的地址!
(所以,我上面那个Pointer都没有必要加,呵呵....)
其中一个是属于运行期分配动态内存分配的
C++和Delphi的在对象的管理不同之一就在这里,C++可以有对象变量,而Delphi只能有对象的引用,换句话说,Delphi的所有的对象和其他的基本类型的内存管理都不同,我们定义的对象变量都是一个指针,在程序运行的时候通过显示的调用其构造函数来分配内存。但是对象所拥有的方法(过程、函数)的地址有不同,每个类实例也就是对象并没有包含方法的地址(也许Delphi会有不同,但是因该和C++的也差不多),实际上每个对象只包含了一个函数列表指针,这个指针指向的地址包含了函数地址。也就是说不论是哪个对象,他们的函数的地址都是一样的,因为这个只有一份
TA = class
end;
等于
TA = class(TObject)
end;