最近用delphi,发现一个问题,不知道我说的对不,delphi的对象名只不过是个指针,还不是常指针,可以随便改所以我有两个问题:
   1.delphi的变量名是否只是个指针???
   2.delphi的对象是不是不可能写在栈中,成为自动变量自动释放????
    我一直想用一个引用变量来引用一个对象,发现不知道该怎么办,delphi貌似没有定义引用变量,经过多番尝试,居然可以定义一个任意类型的指针就能引用任何对象,比如一个tbutton型指针p,只需要执行,p:=tbutton(richedit1);然后就可以trichedit(p).来操作richedit1对象。用一个按钮类型的指针去操作文本编辑对象这也太离奇了。
    所以我只能得出个猜测,delphi根本就没有C++意义中的对象名,他只有一个指向该对象内存的指针,就是类似于C++中用new给指针分配内存一样,这么搞可能也不能自动释放对象,只是把指针给释放了(这个我没研究过,至少C++中的new不可以),是不是在delphi里每次在子函数创建一个临时对象就必须在跳出函数自己释放????
    C++里的对象在子函数里默认的可是自动变量,写在栈中,肯定会自动释放

解决方案 »

  1.   

    1.是。delphi的对象变量就是一个指针;
    2.delphi不能在栈上创建对象。创建对象只能调用构造函数Create创建,然后自己通过free来释放。如果想实现自动释放只能用接口,用TInterfacedObject实现接口可以有自动释放的效果
      

  2.   

    Delphi的对象类似C++的对象指针和对象引用的混合体.
    这两种语言的对象概念不能完全对应.
      

  3.   

    源码编译成机器码后,所有变量名都变成了内存地址,Delphi, C++ 和其他编译语言都是这样。像整数这样的变量,会在此地址处直接划出四个字节存储整数值。静态数组也是这样,不同的只是所划分内存要根据数组类型和大小来定。静态变量无需释放内存。其内存是在程序加载时自动划分的,程序退出时这段内存将随整个代码自动释放。动态数组则不然,此内存地址在编译时只划分出四个字节(32位系统下)作为指针,其数据所占的内存要在程序运行时临时申请,其起始地址就保存在这个指针变量中。这种动态内存在程序退出前必须得释放,要不然会变成垃圾。这种释放也许得由应用程序显式执行,也许会由编译程序隐式执行,不同语言有不同做法。对象的内存管理和数组很相似,分为静态对象和动态对象,不同语言有不同管理方式。Delphi 不支持静态对象,所有对象变量都是指针,对象所占内存空间必须在程序执行时通过 Create 来申请,程序退出前也必须通过 Free 或 Release 来释放。对象和数组的不同之处是:对象包含数据和函数代码两部分。同一对象的不同实例都有各自独立的数据部分,都要占用内存空间,所以不同对象实例不会相互干扰。函数代码所占内存只申请一次,所有实例共享同一内存空间。同一线程中也不会相互干扰。但在不同线程中就需要考虑访问冲突问题,有时候需要用特殊手段避免冲突。
      

  4.   

    1.delphi的变量名是否只是个指针???
    这个不一定,基本类型的变量如何是指针?对象名可以理解为指针(到d7为止,后续版本的delphi情况不知)
    2.delphi的对象是不是不可能写在栈中,成为自动变量自动释放????
    到d7为止不行,后续版本的delphi情况不知指针只是存储了一个内存的首地址,指针类型的约束是对编译器的,对程序员实际没有约束,想怎么用就怎么用,因为内存中没有对象没有类型没有类什么也没有,只有地址,c++中一样可以用int指针去操作字符串或类实例,但这样是有隐患的,你自己必须知道该怎么操作内存,尤其是两种指针分配的内存大小不一样的时候。d和c++这种不同可以说各有好处把,在d中实例永远是指针,所以传递的时候任何情况不会发生对象复制的情况,你要复制就要显示创建一个新的对象进行复制,而c++中允许直接传递对象,但对象复制和副本的重构造会使用大量的资源,使用不当会有比较大的影响。