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的處理方法。