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

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

編輯:Delphi

OOP Pascal也有棧對象,棧對象的定義和創建:

type
   TStackObject = object // 注意此處的聲明,object為保留字表明為棧對象
   public
     constructor Create;
     destructor Destroy;
     procedure DoPrint;
   end;
var
   stackObj: TStackObject;
{ TStackObject }
constructor TStackObject.Create;
begin
   Writeln('Create');
end;
destructor TStackObject.Destroy;
begin
   Writeln('Destroy');
end;
procedure TStackObject.DoPrint;
begin
   Writeln('DoPrint');
end;
begin
   // 注意此處的代碼,不需要使用TStackObject.Create
   stackObj.DoPrint;
   Readln;
end.

運行結果:

從結果我們可以看到,與c++不同的是,OOP Pascal所謂的棧對象的構造和析構,不受constructor方法和destructor方法控制,我們不能捕獲到OOP Pascal棧對象的構造和析構。

二、智能指針簡介

經過前面分析,我們知道,棧對象的聲明周期由後台管理,棧對象在聲明時進行構造,當方法退出或者類被銷毀時(此時棧對象為類的成員變量),棧對象的生命周期也會隨著結束,後台自動會調用它們的析構函數並釋放棧空間。

而堆對象必須由程序員手動的釋放,如果一個方法只有一兩個堆對象我們還能應付的過來,但是當堆對象非常多,而且堆對象一般都要經過多個方法的傳遞、賦值,傳遞到最後,非常容易忘了delete,造成內存洩露。

能不能讓後台也去自動管理堆對象的釋放呢?前輩們想到一個辦法,就是讓一個棧對象包含一個堆對象的引用,當棧對象被後台自動釋放時,會調用棧對象的析構函數,於是,在棧對象的析構函數裡寫下delete堆對象指針的語句。這樣,就完成了後台間接管理堆對象,以上就是stl中的智能指針auto_ptr的處理方法。

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