MyException - 我的异常网
当前位置:我的异常网» Delphi » delphi的对象名只是个指针吗?刚开始接触,求教。解

delphi的对象名只是个指针吗?刚开始接触,求教。解决思路

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

------解决方案--------------------
源码编译成机器码后,所有变量名都变成了内存地址,Delphi, C++ 和其他编译语言都是这样。像整数这样的变量,会在此地址处直接划出四个字节存储整数值。静态数组也是这样,不同的只是所划分内存要根据数组类型和大小来定。静态变量无需释放内存。其内存是在程序加载时自动划分的,程序退出时这段内存将随整个代码自动释放。

动态数组则不然,此内存地址在编译时只划分出四个字节(32位系统下)作为指针,其数据所占的内存要在程序运行时临时申请,其起始地址就保存在这个指针变量中。这种动态内存在程序退出前必须得释放,要不然会变成垃圾。这种释放也许得由应用程序显式执行,也许会由编译程序隐式执行,不同语言有不同做法。

对象的内存管理和数组很相似,分为静态对象和动态对象,不同语言有不同管理方式。Delphi 不支持静态对象,所有对象变量都是指针,对象所占内存空间必须在程序执行时通过 Create 来申请,程序退出前也必须通过 Free 或 Release 来释放。

对象和数组的不同之处是:对象包含数据和函数代码两部分。同一对象的不同实例都有各自独立的数据部分,都要占用内存空间,所以不同对象实例不会相互干扰。函数代码所占内存只申请一次,所有实例共享同一内存空间。同一线程中也不会相互干扰。但在不同线程中就需要考虑访问冲突问题,有时候需要用特殊手段避免冲突。

文章评论

软件开发程序错误异常ExceptionCopyright © 2009-2015 MyException 版权所有