程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 更多編程語言 >> Delphi >> Delphi2009初體驗 - 語言篇 - 智能指針(Smart Pointer)的實現(10)

Delphi2009初體驗 - 語言篇 - 智能指針(Smart Pointer)的實現(10)

編輯:Delphi

六、智能指針與集合

如果我們聲明一個全局變量:

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的垃圾回收機制)。所以,我們使用智能指針,可以放心的創建,放心的引用,而不用去管什麼時候該銷毀,完全由後台幫我們實現。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved