然後我們寫一個控制台程序做試驗:
program TestClassicalAutoPtr;
{$APPTYPE CONSOLE}
uses
SysUtils,
ClassicalAutoPtr in 'ClassicalAutoPtr.pas';
type
TTestClass = class
public
constructor Create; virtual;
destructor Destroy; override;
procedure DoPrint;
end;
{ TTestClass }
constructor TTestClass.Create;
begin
Writeln('Create');
end;
destructor TTestClass.Destroy;
begin
Writeln('Destroy');
inherited;
end;
procedure TTestClass.DoPrint;
begin
Writeln('DoPrint');
end;
procedure DoTest;
var
tt: TTestClass;
begin
// 首先創建一個堆對象
tt := TTestClass.Create;
// 創建一個智能指針,並把堆對象的引用傳入智能指針,由智能指針管理堆對象
TClassicalAutoPtr.New(tt); // 2*
tt.DoPrint;
end;
begin
DoTest;
Readln;
end.
代碼執行結果如下圖所示:
如果我們將代碼2*處替換成
TClassicalAutoPtr.Create (tt);
執行結果將看不到Destroy,析構函數沒有被調用。因為由TClassicalAutoPtr.New返回的是一個interface,而TClassicalAutoPtr.Create返回的是一個Object。
這樣,我們一個簡單的智能指針就完成了。