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后就有记录对象了。

  • 相关阅读:
    javaday19_List接口_Set接口
    01玩转数据结构_04_最基础的动态数据结构:链表
    10 拖拽的对话框_滚动条_放大镜_
    01玩转数据结构_03_栈和队列
    java小技巧
    01玩转数据结构_02_不要小瞧数组
    01玩转数据结构_01_课程介绍
    javaday18_ArrayList
    JZOJ.3777【NOI2015模拟8.17】最短路(shortest)
    JZOJ.5230【NOIP2017模拟8.5】队伍统计
  • 原文地址:https://www.cnblogs.com/del88/p/5407090.html
Copyright © 2011-2022 走看看