動態記憶體的分配與釋放

2021-10-24 12:58:22 字數 3741 閱讀 9841

1.new與delete運算

c++提供了兩個中重要的運算子:new和delete。由於他們是運算子不是函式,因此執行效率更高。

運算子功能

目結合性

用法new

動態分配

單目自右向左

new type

new動態分配陣列

單目自右向左

new type

delete

釋放空間

單目自右向左

delete expr

delete

釋放陣列空間

單目自右向左

delete expr

new 運算子將在自由儲存區中動態分配記憶體,建立物件,一般形式為:

(1)分配指定型別的記憶體空間,且指定初值:

new 型別

(2)分配指定型別的記憶體空間,且指定初值:

new 型別(初值)

(3)分配乙個(一維或多維陣列):

new 型別[常量表示式]…

new運算結果是指向分配得到的記憶體空間的指標,如果沒有足夠的記憶體空間可以分配,其運算結果是乙個0值指標。

例如

int

*p1,p2;

char

*pz1,

*pz2;

p1=new

int;

//分配乙個整形空間,若成功則p1指向該空間,否則p1為null

p2=new

int(10)

;//分配乙個整形空間,且給整個整形賦初值10,即*p2為10

pz1=

newchar[80

];//分配乙個字元陣列(字串)空間,即pz1為字串指標

pz2=

newchar[5

][80]

;//分配乙個二維字串(字串陣列)空間,即pz1為字串陣列指標

delete運算子釋放記憶體返回給自右儲存區,銷毀物件,一般形式為

(1)釋放已分配的記憶體空間

delete 指標表示式

(2)釋放已分配的陣列記憶體空間

delete 指標表示式

delete運算釋放指標所指向的記憶體空間,第(3)種new形式分配的陣列記憶體空間需要用第(2)種delete形式來釋放。

例如:

delete p1;

//釋放p1指向的整形空間

delete

pz1;

//釋放pz1指向的字串空間

delete

pz2;

//釋放pz2指向的字串陣列空間

銷毀物件後,指標p1變得沒有定義,然而它仍然存在先前所指向的物件(已銷毀)的位址,因此指標p1不再有效,成這樣的指標為懸垂指標。懸垂指標指向曾經有效的物件記憶體,但該物件已經不再存在。使用垂懸指標往往導致程式錯誤,而且很難檢測出來糖廠在delete運算之後將指標重設為0值指標,避免垂懸指標。

用new建立的動態物件使用完之後,必須用delete銷毀。若是0值指標,delete運算不起任何作用。

int

*p=0

;delete p;

//使用正確,無意義

//delete只刪除由new建立的動態物件,否則將導致程式錯誤。例如:

int a,

*p=&a,

*p1;

string str=

"hello"

;p1=

newint

(100);

delete p1;

//正確

delete str;

//錯誤,str不是動態物件

delete p;

//錯誤,p所指向的a是靜態分配尋出空間的。

2.動態記憶體分配函式

(1)malloc函式

malloc函式用於分配乙個指定大小的記憶體空間,函式原型為:

void *malloc(size_t size);

若分配成功,函式返回乙個指向該記憶體空間起始位址的viod型別指標;若分配失敗,函式返回0值指標null。引數size表示申請分配的位元組數,型別size_t一般為unsigned int。

在實際程式設計中,malloc函式返回的void型別指標可以顯示轉換為其他型別的指標。呼叫函式時,一般使用sizeof來計算記憶體的大小,需要注意的是,分配的到的記憶體空間是未初始化的,即記憶體中的資料不是確定的。

例如

int

*p=(

int)

malloc

(sizeof

(int

))

若分配成功,p指向分配得到的記憶體單元,*p表示該記憶體單元。

(2)calloc函式

calloc函式用於分配n個連續的指定大小的記憶體空間,函式原理為:

void

malloc

(size_t nmemb,size_t size)

每個記憶體空間的大小為size位元組,總位元組數為n*size,並且將分配得到的記憶體空間的位址全部初始化為0.若分配成功,指向分配記憶體空間的起始位址,若失敗,返回0值指標null

例如,分配20個int型別(相當於int p[20])記憶體空間

int

*p=(

int*

)calloc(20

,sizeof

(int))

;等價於

int*p=

(int*)

malloc(20

*sizeof

(int))

;

3、動態記憶體的調整函式

realloc函式用於調整已分配記憶體空間的大小,函式原型為:

void

*realloc

(void

*ptr,size_t size)

;

realloc將指標ptr所指向的動態記憶體空間擴大或者縮小為size大小,無論擴大或者縮小,原記憶體中的餓內容不變。縮小空間會丟失縮小的那部分內容(假如記憶體縮小為原來的一般,則原來位址的後半部分消失;如果增加也是增加到原來位址的後半部分),

例如:

int

*p;p=

(int*)

malloc(20

*sizeof

(int))

;p=(int*)

realloc(10

*sizeof

(int))

;p=(int*)

realloc(60

*sizeof

(int))

;

4、動態記憶體釋放函式

free函式用來釋放動態分配的記憶體空間,函式原型為:

/*ptr指向已有的動態記憶體空間,如果ptr為空,什麼操作也不執行*/

void

free

(void

*ptr)

;

在實際程式設計中,若某個動態分配的記憶體不再使用時,應該及時將其釋放。在動態分配的記憶體釋放後,就不能再通過指標去訪問,否則會導致程式出現崩潰。

通常,ptr釋放後,需要設定ptr為null,避免產生「迷途指標」。

int

*p;p=

(int*)

malloc

(sizeof

(int))

;free

(p);

p=null

;

C語言之動態記憶體分配與釋放

1,堆記憶體特點 堆記憶體可以存放任意型別的資料,但需要自己申請與釋放。2,堆大小 堆大小,想像中的無窮大,但實際使用中,受限於實際記憶體的大小和記憶體是否有連續性。1,malloc函式 2,calloc函式 3,realloc函式 4,free函式 示例 include include int m...

C 動態記憶體的分配和釋放

1,new和delete的基本使用形式。用new用於堆內的記憶體的分配的基本形式 指標變數名 new 型別 1定義乙個整型指標將變數 int p p new int 指標變數名 new 型別名 初值 用delete用於new分配的堆記憶體的釋放 語法形式 delete 運算子例子 include u...

動態記憶體建立與釋放

使用時應加上標頭檔案 include 一.申請動態記憶體 申請動態記憶體 malloc calloc realloc,申請的動態記憶體分為多少份此函式無法明確,所以應在malloc calloc realloc前面加上型別 1.malloc malloc函式的形參為所要申請的動態記憶體位元組數 動態...