動態記憶體管理new delete

2021-06-26 02:23:27 字數 2133 閱讀 8679

動態記憶體管理

動態物件(堆物件)是程式在執行過程中在動態記憶體中用new運算子建立的物件。

由於是使用者自己用new運算子建立的,因此也要求使用者自己用delete運算子釋放,即使用者必須自己管理動態記憶體。

計算機記憶體資料區常有三種分割槽,即靜態資料區、堆區、桟區。

1.程式在編譯時就為靜態變數和靜態物件分配了靜態資料儲存區。在靜態資料區中儲存的變數或物件在該程式的整個執行期間都存在,

它們的生命週期貫穿整個程式的執行週期。比如全域性變數、static(靜態)變數等都是儲存在靜態資料區。

2.呼叫函式時,函式內的區域性變數和形式引數等將在桟區中分配儲存單元。這部分變數的生命週期與函式的執行時間相同。

當函式執行結束時,儲存這些變數的儲存單元會被自動釋放,從而這些變數的生命週期也就結束了。

由於桟區的大小一般很有限,因此能夠同時儲存在桟區中的變數數量有限。

由於儲存在桟區中的變數生命周期短,因此桟區的使用率高很高,可以不斷成為新生成變數的存放空間。

3.當執行new運算子時,系統會自動在動態記憶體空間中分配儲存,動態記憶體位於堆區,它是唯一乙個生存期可以由程式設計師自己控制的儲存空間。

程式在執行時程式設計師可以用new申請動態記憶體空間,但不用時,程式設計師必須自己用delete釋放這部分空間(釋放記憶體)。

因此,程式在這部分出錯的概率極高。

管理動態記憶體空間的運算子是new和delete,還有new與delete.

c語言中用 malloc()和free()函式申請分配和釋放動態記憶體空間。

c++用new和delete運算子來申請分配和釋放動態記憶體空間。

new運算子可以自動計算所申請空間的大小,而malloc()函式則必須由程式設計師指出所需申請分配空間的大小。

[cpp]view plain

copy

#include

using

namespace

std;  

intmain()  

cout<<*p1for(

inti=0;i<3;i++)  

cout<

delete

p3;  

delete

p2;  

delete

p1;  

delete

p4;  

p1=null;  

p2=null;  

p3=null;  

p4=null;  

system("pause"

);  

return

0;  

}  

注意:1.當系統無法滿足動態記憶體分配的請求時他將會返回null,所以new執行後必須判斷返回的指標值是否為null,是則表示動態記憶體分配不成功。

只有返回值是非null時,才可繼續執行後續的操作。

如果對乙個,一申請成功的指標進行相關的記憶體操作將可能引起系統崩潰。

2.delete只能用來釋放用new申請分配的動態記憶體空間;反之,new申請的動態記憶體空間必須用delete來釋放。

delete與new必須有對應的關係。

3.delete執行之後,指標所指向的記憶體空間就被釋放了,而指向該動態記憶體區域的指標變數本身並不會因為delete有任何改變。

4.delete之後,不對指標變數做任何處理,就會造成「指標懸掛」;

5.指標變數宣告後沒有進行初始化就通過它操作記憶體空間,則可能製造乙個「野指標」;

6.關於指標和動態記憶體要特別注意:

指標消亡了,並不代表它所指向的動態記憶體會被自動釋放,自動消亡;

動態記憶體被釋放了,並不代表指向該動態記憶體的指標變數會消亡或自動變成null;

做到以下幾點:

1.定義指標變數的同時初始化。如不初始化就一定要將其設定成null,避免該指標指向乙個不確定的地方,引發誤操作,這是非常危險的。

一旦把它置成null,誤用它就不會造成太大問題;

2.delete指標以後,第一時間將其設定為null。即使是乙個馬上就要消亡的區域性指標變數,也可立即將其置成null。養成良好的習慣是避免錯誤的有效方法;

3.當指標指向陣列時,一定謹慎防止指標越界操作;

4.避免用指標傳遞桟記憶體,避免返回乙個即將自動消亡的區域性變數或區域性物件的位址。

桟記憶體中的區域性變數和區域性物件都不能跨函式生存,要注意它們的生存週期。

動態記憶體管理 new delete

動態記憶體管理 動態物件 堆物件 是程式在執行過程中在動態記憶體中用new運算子建立的物件。因為是使用者自己用new運算子建立的。因此也要求使用者自己用delete運算子釋放,即使用者必須自己管理動態記憶體。計算機記憶體資料區常有三種分割槽。即靜態資料區 堆區 桟區。1.程式在編譯時就為靜態變數和靜...

c 動態記憶體管理 new delete

c語言是通過使用malloc calloc realloc free進行記憶體管理 malloc 直接開闢空間 calloc 開闢空間時會進行初始化 realloc 它的函式原型為 void realloc void ptr,size t size 當引數 ptr為空時,realloc等價於mall...

C 的動態記憶體管理,new delete

tips 軟體工程知識 1.通常會為任何乙個使用動態分配記憶體的類同時提供一組函式 複製建構函式,析構函式,過載的賦值運算子函式。常見的程式設計錯誤 2.當類的物件包含指向動態記憶體分配的指標時,如果不為其提供過載的賦值運算子和複製建構函式,會導致邏輯錯誤 c 動態記憶體管理 在c 程式中對任何內建...