動態記憶體管理
動態物件(堆物件)是程式在執行過程中在動態記憶體中用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 程式中對任何內建...