C 物件的動態建立和釋放

2021-07-16 12:57:38 字數 1458 閱讀 3168

使用類名定義的物件(請檢視:

c++類的宣告和物件的定義

)都是靜態的,在程式執行過程中,物件所佔的空間是不能隨時釋放的。但有時人們希望在需要用到物件時才建立物件,在不需要用該物件時就撤銷它,釋放它所佔的記憶體空間以供別的資料使用。這樣可提高記憶體空間的利用率。

在c++中,可以使用new運算子動態地分配記憶體,用delete運算子釋放這些記憶體空間(請檢視:

c++動態分配記憶體(new)和撤銷記憶體(delete)

)。這也適用於物件,可以用new運算子動態建立物件,用delete運算子撤銷物件。

如果已經定義了乙個box類,可以用下面的方法動態地建立乙個物件:

new box;

編譯系統開闢了一段記憶體空間,並在此記憶體空間中存放乙個box類物件,同時呼叫該類的建構函式,以使該物件初始化(如果已對建構函式賦予此功能的話)。

但是此時使用者還無法訪問這個物件,因為這個物件既沒有物件名,使用者也不知道它的位址。這種物件稱為

無名物件

,它確實是存在的,但它沒有名字。

用new運算子動態地分配記憶體後,將返回乙個指向新物件的指標的值,即所分配的記憶體空間的起始位址。使用者可以獲得這個位址,並通過這個位址來訪問這個物件。需要定義乙個指向本類的物件的指標變數來存放該位址。如

box *pt;  //定義乙個指向box類物件的指標變數pt

pt=new box;  //在pt中存放了新建物件的起始位址

在程式中就可以通過pt訪問這個新建的物件。如

coutcoutc++還允許在執行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運算子時,在釋放記憶體空間之前,自動呼叫析構函式,完成有關善後清理工作。

物件的動態建立和釋放

new 動態地分配記憶體 delet 釋放記憶體 用new建立的物件只能通過指標訪問,建立物件時執行建構函式,有時候會出現記憶體不足,會出現異常。不再需要由new建立的物件時,用delete運算子釋放。否則會造成記憶體洩漏的情況。在釋放記憶體空間之前,自動呼叫析構函式,完成有關善後清理的工作。也就是...

物件的動態建立和釋放(new delete)

c malloc free c new delete 在c語言中malloc只會分配記憶體大小,不會呼叫類的建構函式,free不會呼叫類的析構函式 main cint p int malloc sizeof int p 10 free p int a int malloc sizeof int 10...

物件的建立和釋放

1 new和delete基本語法 1 new和delete基本語法 1 在軟體開發過程中,常常需要動態地分配和撤銷記憶體空間,例如對動態鍊錶中結點的插入與刪除。在c語言中是利用庫函式malloc和free來分配和撤銷記憶體空間的。c 提供了較簡便而功能較強的運算子new和delete來取代mallo...