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