定義:
c++中,動態記憶體分配技術可以保證程式在執行過程中按照實際需要申請適量的記憶體,使用結束後還可以釋放
這種在程式執行過程中,申請和釋放的儲存單元稱為
堆物件,申請和釋放過程一般稱為建立和刪除
c++建立和刪除堆物件使用兩個運算子:new 和 delete
運算子:new
功能:動態分配記憶體,或者動態建立堆物件
語法形式:
new 資料型別(初始化引數列表);
記憶體申請成功,new運算返回乙個指向新分配記憶體首位址的型別的指標(可以通過這個指標訪問堆物件);申請失敗,丟擲異常
eg:int * point = new int; 無括號,不初始化
int * point = new int(); 有括號,無初始值,表示用0對其初始化
new 建立類的物件:
1) 當有預設建構函式
new 類名 與 new 類名() 等效,都會呼叫預設建構函式
2) 當未定義預設建構函式:
new 類名 會呼叫隱含預設建構函式
new 類名():系統除了執行預設建構函式,還會為基本資料型別和指標型別的成員用0賦初值(這一過程是遞迴的)
運算子: delete
語法形式: delete 指標名;
功能:用於刪除new建立的物件,釋放指標所指向的記憶體空間
如果被刪除的是物件,該物件的析構函式將被呼叫
對於用new分配的記憶體,只能使用delete進行一次刪除操作,如果對同一記憶體空間使用多次delete進行刪除會導致執行錯誤
注意: 用new分配的記憶體,必須用delete加以釋放,否則會導致
記憶體洩露
:動態記憶體分配的記憶體無法**,使得程式佔據的記憶體越來越大
2. new 運算子動態建立
陣列:語法形式:
new 型別名[陣列長度]; 陣列長度指出了陣列元素的個數 ,可以是任何正整數值的表示式
細節: new 型別名[陣列長度]: 無括號,則與執行 "new t" 進行的初始化方式一樣 [
無括號,不初始化]
new 型別名[陣列長度] ( ): 加括號,則與執行 "new t( )" 所進行初始化的方式相同 [
小括號裡不能帶有任何引數]
eg: int *p = new int[10]( ) 可以方便地為動態建立的陣列用0值初始化
delete刪除陣列: 要在指標名前前加"[ ]"
delete[ ] 指標名;
拓展:c++可以將陣列建立和刪除過程封裝起來,形成乙個動態陣列類
在動態陣列類中,通過類的成員函式訪問陣列元素,每次訪問之前檢查下標是否越界
用c++的 assert(
斷言)實現:
assert是c++的assert標頭檔案中定義的乙個巨集,用來判斷乙個條件表示式的值是否為ture
如果不為true,則程式會中止,並且報告出錯誤,這樣就很容易將錯誤定位
乙個程式一般可以以兩種模式編譯—除錯模式(
debug)和發行模式(
release): assert 只能在除錯模式下生效,而在發行模式下不執行任何操作
assert 只是檢查程式本身的邏輯錯誤,而使用者的不當輸入造成的錯誤,應用其他方法加以處理
語法形式:
new 型別名 t [陣列第1維長度][陣列第2維長度]……;
其中: 陣列第一維長度:可以是任何結果為正整數的表示式,而其他各維陣列長度必須是結果為正整數的常量表示式
eg: (錯誤) float *fp;
fp = new float[10][25][10]; 錯誤原因: new操作產生的是乙個指向25*10的二維float型別陣列的指標,而fp是指向float型資料的指標
(正確)
float(*cp)[25][10];
cp = new float[10][25][10];
刪除依舊簡單: delete cp; (僅管是多維,但一次就可以刪除釋放)
動態記憶體分配
在c 中建立乙個物件時,我們必須要為這個物件申請一塊記憶體,而且要用建構函式對這塊記憶體進行初始化。c 中的new和delete相對於c的庫函式malloc和free在這方面有很大的優勢,所以我們主要講的是運算子new和delete。當用new來建立乙個物件時,它會自動在堆裡為物件分配記憶體並且為這...
動態記憶體分配
為什麼使用動態記憶體分配?c語言中的一切操作都是基於記憶體的 變數和陣列都是記憶體的別名,如何分配這些記憶體由編譯器在編譯期間決定 定義陣列的時候必須指定陣列唱的 而陣列長度是在編譯期就必須決定的 需求 程式執行的過程中,可能需要使用一些額外的記憶體空間 malloc和free malloc和fre...
動態記憶體分配
c的儲存類別有4種 自動的 auto 靜態的 statics 暫存器的 register 外部的 extern 全域性變數時分配在記憶體中的靜態儲存區 靜態區域性變數屬於靜態儲存類別,在靜態儲存區內分配儲存單元,是在編譯時賦初值的,只賦初值一次,在程式執行時它已有初值,以後每次呼叫函式時不再重新賦初...