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

原文地址:https://www.cnblogs.com/del88/p/5407090.html