C++中物件的動態建立與釋放
前面介紹的方法定義的物件是靜態的,在程式執行過程中,物件所佔的空間是不能隨時釋放的。但有時人們希望在需要用到物件時才建立物件,在不需要用該物件時就撤銷它,釋放它所佔的記憶體空間以供別的資料使用。這樣可提高記憶體空間的利用率。
在前邊介紹了用new運算子動態地分配記憶體,用delete運算子釋放這些記憶體空間。這也適用於物件,可以用new運算子動態建立物件,用delete運算子撤銷物件。
如果已經定義了一個Box類,可以用下面的方法動態地建立一個物件:
new Box;
編譯系統開闢了一段記憶體空間,並在此記憶體空間中存放一個Box類物件,同時呼叫該類的建構函式,以使該物件初始化(如果已對建構函式賦予此功能的話)。
但是此時使用者還無法訪問這個物件,因為這個物件既沒有物件名,使用者也不知道它的地址。這種物件稱為無名物件,它確實是存在的,但它沒有名字。
用new運算子動態地分配記憶體後,將返回一個指向新物件的指標的值,即所分配的記憶體空間的起始地址。使用者可以獲得這個地址,並通過這個地址來訪問這個物件。需要定義一個指向本類的物件的指標變數來存放該地址。如
Box *pt; //定義一個指向Box類物件的指標變數pt
pt=new Box; //在pt中存放了新建物件的起始地址
在程式中就可以通過pt訪問這個新建的物件。如
cout<<pt->height; //輸出該物件的height成員
cout<<pt->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://see.xidian.edu.cn/cpp/biancheng/view/206.html
http://see.xidian.edu.cn/cpp/biancheng/cpp/jichu_1/(C++基礎知識講解)
相關文章
- C++ - 二級指標動態記憶體申請與釋放C++指標記憶體
- C/C++ 實現動態資原始檔釋放C++
- Python中動態類和動態方法的建立與呼叫Python
- 全面解析RayFire的動態物件與靜態物件物件
- 00024.06 反射:反射的應用2:動態建立物件反射物件
- JavaScript物件與建立物件的方式JavaScript物件
- c++物件建立帶括號與無括號的區別C++物件
- 類與物件的建立物件
- TCP連結的建立和釋放TCP
- C++中有三種建立物件的方法C++物件
- c++中的物件模型C++物件模型
- Shiro中Subject物件的建立與繫結流程分析物件
- C++ 中的 const 物件與 const 成員函式C++物件函式
- Java SpringBoot 中,動態執行 bean 物件中的方法JavaSpring BootBean物件
- JS中建立物件的方法JS物件
- C#動態建立介面的實現例項物件C#物件
- 如何在iView中動態建立表格View
- JDK動態代理物件與被代理物件地址值問題JDK物件
- C++中函式指標與函式物件C++函式指標物件
- 詳解.NET依賴注入中物件的建立與“銷燬”依賴注入物件
- 自動釋放池
- C++ vector 釋放記憶體的兩種方法C++記憶體
- 120 C++中的物件指標C++物件指標
- 關於JObject的用法,以及實現動態生成實體物件、動態建立一些Josn組合Object物件
- C/C++記憶體分配以及釋放C++記憶體
- Java 中建立子類物件會建立父類物件麼?Java物件
- 關於C++類的定義和物件的建立詳解C++物件
- Java中建立物件的5種方式Java物件
- 動態庫的建立和呼叫
- python如何動態的建立類?Python
- C#中關閉子視窗而不釋放子視窗物件的方法C#物件
- 關於C++中物件與類的詳解及其作用詳解C++物件
- java中的靜態繫結與動態繫結Java
- [C++之旅] 14 物件成員與物件陣列C++物件陣列
- c++動態記憶體管理與智慧指標C++記憶體指標
- C++動態記憶體管理與原始碼剖析C++記憶體原始碼
- 建立動態陣列陣列
- 怎麼手動在rstudio中釋放記憶體?記憶體
- c++中的靜態成員C++