六、智能指針與集合
如果我們聲明一個全局變量:
var
gAp: IAutoPtr<TTestClass>;
並從DoTestAutoPtr方法開始改變其下代碼:
procedure DoTestAutoPtr;
var
tt: TTestClass;
ap: IAutoPtr<TTestClass>;
begin
ap := TAutoPtr<TTestClass>.New(TTestClass.Create(10));
tt := ap.Get;
tt.DoPrintInt;
gAp := ap;
end;
begin
DoTestAutoPtr;
Writeln('Exit DoTestAutoPtr');
Writeln('gAp nil');
gAp := nil; // 4*
Readln;
end.
結果如下:
我們可以看到,當調用完畢DoTestAutoPtr方法後,方法內的堆對象tt並沒有銷毀,這說明智能指針ap並沒有銷毀。
因為在DoTestAutoPtr方法最後一行,將ap接口變量賦值給了全局變量gAp,此時接口的引用計數+1,方法退出後,ap變量被銷毀,接口的引用計數-1,但是gAp仍然引用著對象,所以引用計數不為0。當運行到第4*步時,強制把gAp指向空地址,對象的引用計數-1,為0,這個時候後台自動調用對象的析構函數Destroy(這有點像Java或.Net的垃圾回收機制)。所以,我們使用智能指針,可以放心的創建,放心的引用,而不用去管什麼時候該銷毀,完全由後台幫我們實現。