所謂動態記憶體分配就是指在程式執行的過程中動態地分配或者**儲存空間的分配記憶體的方法。動態記憶體分配不象陣列等靜態記憶體分配方法那樣需要預先分配儲存空間,而是由系統根據程式的需要即時分配,且分配的大小就是程式要求的大小。
c/c++定義了4個記憶體區間:**區,全域性變數與靜態變數區,區域性變數區即棧區,動態儲存區,即堆區或自由儲存區。
通常定義變數(或物件),編譯器在編譯時都可以根據該變數(或物件)的型別知道所需記憶體空間的大小,從而系統在適當的時候為他們分配確定的儲存空間。這種記憶體分配稱為靜態儲存分配;有些操作物件只在程式執行時才能確定,這樣編譯時就無法為他們預定儲存空間,只能在程式執行時,系統根據執行時的要求進行記憶體分配,這種方法稱為動態儲存分配。所有動態儲存分配都在堆區中進行。當程式執行到需要乙個動態分配的變數或物件時,必須向系統申請取得堆中的一塊所需大小的存貯空間,用於存貯該變數或物件。當不再使用該變數或物件時,也就是它的生命結束時,要顯式釋放它所占用的存貯空間,這樣系統就能對該堆空間進行再次分配,做到重複使用有限的資源。
在使用陣列的時候,總有乙個問題困擾著我們:陣列應該有多大?在很多的情況下,你並不能確定要使用多大的陣列,比如上例,你可能並不知道我們要定義的這個陣列到底有多大,那麼你就要把陣列定義得足夠大。這樣,你的程式在執行時就申請了固定大小的你認為足夠大的記憶體空間。即使你知道你想利用的空間大小,但是如果因為某種特殊原因空間利用的大小有增加或者減少,你又必須重新去修改程式,擴大陣列的儲存範圍。這種分配固定大小的記憶體分配方法稱之為靜態記憶體分配。但是這種記憶體分配的方法存在比較嚴重的缺陷,特別是處理某些問題時:在大多數情況下會浪費大量的記憶體空間,在少數情況下,當你定義的陣列不夠大時,可能引起下標越界錯誤,甚至導致嚴重後果。
我們用動態記憶體分配就可以解決上面的問題. 所謂動態記憶體分配就是指在程式執行的過程中動態地分配或者**儲存空間的分配記憶體的方法。動態記憶體分配不象陣列等靜態記憶體分配方法那樣需要預先分配儲存空間,而是由系統根據程式的需要即時分配,且分配的大小就是程式要求的大小。
從以上動、靜態記憶體分配比較可以知道動態記憶體分配相對於靜態記憶體分配的特點:
1、不需要預先分配儲存空間;
2、分配的空間可以根據程式的需要擴大或縮小。
在c++中,動態記憶體的分配主要由new 運算子與delete 運算子來完成(有別於c語言中的malloc族 函式 )
申請乙個儲存單元,返回首位址的指標,或者null
《指標》
=new
;int
*temp =
newint
;
申請乙個陣列
《指標》
=new
[常量表示式]
;int
*temp =
newint
[maxsize]
;
申請乙個二維陣列
《指標》
=new
[常量表示式1
][常量表示式2];
int*temp =
newint
[maxsize1]
[maxsize2]
;
釋放new申請到的記憶體(一定要記得!!!最好在寫下new的時候就一併寫下delete,然後再在二者之間填充語句)
delete p;
ordelete
p;
既然malloc( )和free( )庫函式可以實現動態分配的需要,為什麼還要new和delete呢?
// 都是類的fault
這是因對於非內部資料型別的物件而言,只用庫函式malloc( )和free( )無法滿足動態物件的要求。我們知道,物件在建立的同時要執行建構函式,物件在消亡之前要執行析構函式。由於malloc( )和free( )是庫函式而不是運算子,不在編譯器的控制許可權之內,不能把執行建構函式和析構函式的任務強加於它們
(引用dablelv的博文)不說啦,直接貼鏈結吧?
動態記憶體分配
在c 中建立乙個物件時,我們必須要為這個物件申請一塊記憶體,而且要用建構函式對這塊記憶體進行初始化。c 中的new和delete相對於c的庫函式malloc和free在這方面有很大的優勢,所以我們主要講的是運算子new和delete。當用new來建立乙個物件時,它會自動在堆裡為物件分配記憶體並且為這...
動態記憶體分配
為什麼使用動態記憶體分配?c語言中的一切操作都是基於記憶體的 變數和陣列都是記憶體的別名,如何分配這些記憶體由編譯器在編譯期間決定 定義陣列的時候必須指定陣列唱的 而陣列長度是在編譯期就必須決定的 需求 程式執行的過程中,可能需要使用一些額外的記憶體空間 malloc和free malloc和fre...
動態記憶體分配
c的儲存類別有4種 自動的 auto 靜態的 statics 暫存器的 register 外部的 extern 全域性變數時分配在記憶體中的靜態儲存區 靜態區域性變數屬於靜態儲存類別,在靜態儲存區內分配儲存單元,是在編譯時賦初值的,只賦初值一次,在程式執行時它已有初值,以後每次呼叫函式時不再重新賦初...