zoukankan      html  css  js  c++  java
  • Delphi栈对象

    来自:http://blog.csdn.net/iseekcode/article/details/5158985

    ----------------------------------------------------------------------------

    //如需转载请注明出处
    //作者: 逍遥萧
    //来源: http://www.xy13.cn

    估计很多用了Delphi很多年的都不知道Delphi有支持栈对象.
    C++里对象即可以创建为堆对象,也可以创建为栈对象
    常用的对象都是从TObject继承,此种对象需要创建释放,不然会内存漏洞
    而栈对象不需要创建,也不需要释放,当对生命周期完成时会自动清理
    下面测试一下效果

    type
      PA = ^TA;
      TA = object
        D1: Integer;
        D2: Word;
        D3: Byte;
        constructor Create;
        destructor Destroy;
      end;

    constructor TA.Create;
    begin
      ShowMessage('Create');
    end;

    destructor TA.Destroy;
    begin
      ShowMessage('Destroy');
    end;

    procedure TForm2.Button1Click(Sender: TObject);
    var
      A: TA;
    begin
      ShowMessage(IntToStr(A.D1));       //对象A不需要创建,直接访问
      ShowMessage(IntToStr(SizeOf(TA))); //7    
    end;

    经测试发现对象的构造函数和析构函数并没调用,而且看起来跟packed record很相似,
    堆对象是个指针,大小始终是4,而栈对象的大小由内部数据而定,可见不是指针变量

    再测试栈对象,从堆上创建,即使用new关键字,并且在创建时在参数里带上构造函数
    procedure TForm2.Button1Click(Sender: TObject);
    var
      A: PA;
    begin
      New(A, Create);
      ShowMessage(IntToStr(A^.D1));
      Dispose(A, Destroy);      
    end;

    如果new 后面不带参数.构造函数不会被执行,而且带了之后,对象还会被初始化
    这里就是唯packed record的区别了,record不能带构造函数,否则无法编译

    感觉意义不大,白高兴一场,如果D7用户还有点用处,因为record里不支持方法


    -------------------------------------------------------------------------

    可惜,孤陋寡闻多年,才知道。
    我的一个自定义数据库里,有个数据头结构,如果定义为object的话,数据库升级
    版本就方便多了。
    一直用D7。
    据说D2007后就有记录对象了。

  • 相关阅读:
    Objective C 代码片段(类别)
    误释放对象
    浏览器内核信息整理
    Oracle VM Virtual 下CentOS不能自动获取IP地址
    git 命令归纳
    马蜂窝 iOS App 启动治理:回归用户体验
    马蜂窝火车票系统服务化改造初探
    让前端监控数据采集更高效
    状态机在马蜂窝机票订单交易系统中的应用与优化实践
    马蜂窝张矗:我对技术团队绩效考核管理的几点思考
  • 原文地址:https://www.cnblogs.com/del88/p/5407090.html
Copyright © 2011-2022 走看看