Delphi棧對象

 

//如需轉載請註明出處
//作者: 逍遙蕭
//來源: 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後就有記錄對象了。

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章