動態記憶體管理 new delete

2021-09-09 02:31:43 字數 2093 閱讀 8267

動態記憶體管理

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

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

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

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

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

2.呼叫函式時。函式內的區域性變數和形式引數等將在桟區中分配儲存單元。

這部分變數的生命週期與函式的執行時間同樣。

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

因為桟區的大小一般非常有限。因此可以同一時候儲存在桟區中的變數數量有限。

因為儲存在桟區中的變數生命周期短,因此桟區的使用率高非常高,能夠不斷成為新生成變數的存放空間。

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

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

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

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

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

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

new運算子能夠自己主動計算所申請空間的大小,而malloc()函式則必須由程式猿指出所需申請分配空間的大小。

#includeusing namespace std;

int main()

cout<<*p1<

僅僅有返回值是非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.避免用指標傳遞桟記憶體。避免返回乙個即將自己主動消亡的區域性變數或區域性物件的位址。

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

注意 delete :

#includeusing namespace std;

int main()

{ int i,*pi1=&i,*pi2=nullptr;

double *pd=new double (33),*pd2=pd;

int ii=0;

//delete i;//錯誤,i不是乙個指標

cout<

對於delete i的請求,編譯器會生成乙個錯誤資訊。由於它知道i不是乙個指標。

執行delete pi1和pd2所產生的錯誤則更具有潛在危害:通常情況下。編譯器不能分辨乙個指標指向的是靜態還有動態分配的物件。同一時候,編譯器也不能分辨乙個指標所指向的記憶體是否已經被釋放了。

動態記憶體管理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 程式中對任何內建...