C++對象的動態建立和釋放

使用類名定義的對象(請查看:C++類的聲明和對象的定義)都是靜態的,在程序運行過程中,對象所佔的空間是不能隨時釋放的。但有時人們希望在需要用到對象時才建立對象,在不需要用該對象時就撤銷它,釋放它所佔的內存空間以供別的數據使用。這樣可提高內存空間的利用率。

在C++中,可以使用new運算符動態地分配內存,用delete運算符釋放這些內存空間(請查看:C++動態分配內存(new)和撤銷內存(delete))。這也適用於對象,可以用new運算符動態建立對象,用delete運算符撤銷對象。

如果已經定義了一個Box類,可以用下面的方法動態地建立一個對象:
new Box;
編譯系統開闢了一段內存空間,並在此內存空間中存放一個Box類對象,同時調用該類的構造函數,以使該對象初始化(如果已對構造函數賦予此功能的話)。

但是此時用戶還無法訪問這個對象,因爲這個對象既沒有對象名,用戶也不知道它的地址。這種對象稱爲無名對象,它確實是存在的,但它沒有名字。

用new運算符動態地分配內存後,將返回一個指向新對象的指針的值,即所分配的內存空間的起始地址。用戶可以獲得這個地址,並通過這個地址來訪問這個對象。需要定義一個指向本類的對象的指針變量來存放該地址。如
Box *pt; //定義一個指向Box類對象的指針變量pt
pt=new Box; //在pt中存放了新建對象的起始地址
在程序中就可以通過pt訪問這個新建的對象。如
cout<height; //輸出該對象的height成員
cout<volume( ); //調用該對象的volume函數,計算並輸出體積

C++還允許在執行new時,對新建立的對象進行初始化。如
Box *pt=new Box(12,15,18);
這種寫法是把上面兩個語句(定義指針變量和用new建立新對象)合併爲一個語句,並指定初值。這樣更精煉。

新對象中的height,width和length分別獲得初值12,15,18。調用對象既可以通過對象名,也可以通過指針。

用new建立的動態對象一般是不用對象名的,是通過指針訪問的,它主要應用於動態的數據結構,如鏈表。訪問鏈表中的結點,並不需要通過對象名,而是在上一個結點中存放下一個結點的地址,從而由上一個結點找到下一個結點,構成鏈接的關係。

在執行new運算時,如果內存量不足,無法開闢所需的內存空間,目前大多數C++編譯系統都使new返回一個0指針值。只要檢測返回值是否爲0,就可判斷分配內存是否成功。

ANSI C++標準提出,在執行new出現故障時,就“拋出”一個“異常”,用戶可根據異常進行有關處理。但C++標準仍然允許在出現new故障時返回0指針值。當前,不同的編譯系統對new故障的處理方法是不同的。

在不再需要使用由new建立的對象時,可以用delete運算符予以釋放。如
delete pt; //釋放pt指向的內存空間
這就撤銷了pt指向的對象。此後程序不能再使用該對象。

如果用一個指針變量pt先後指向不同的動態對象,應注意指針變量的當前指向,以免刪錯了對象。在執行delete運算符時,在釋放內存空間之前,自動調用析構函數,完成有關善後清理工作。

轉:http://c.biancheng.net/cpp/biancheng/view/206.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章