C 動態記憶體管理

2021-09-08 11:24:45 字數 3204 閱讀 2359

一、c語言記憶體管理

1.申請空間

(1)void* malloc(unsigned size);

在記憶體的動態儲存區中分配一塊長度為size位元組的連續區域,引數size為需要記憶體空間的長度,返回該區域的首位址,malloc 分配的記憶體是位於堆中的,並且沒有初始化記憶體的內容,malloc之後,可呼叫函式memset來初始化這部分的記憶體空間。

(2)void* calloc(size_t numelements, size_t sizeofelement); 

calloc 則將初始化這部分的記憶體,設定為0,與malloc相似,引數sizeofelement為申請位址的單位元素長度,numelements為元素個數,即在記憶體中申請numelements*sizeofelement位元組大小的連續位址空間

(3)void* realloc(void* ptr, unsigned newsize);  

realloc 則對malloc申請的記憶體進行大小的調整,給乙個已經分配了位址的指標重新分配空間,引數ptr為原有的空間位址,newsize是重新申請的位址長度,realloc是從堆上分配記憶體的,當擴大一塊記憶體空間時,realloc()試圖直接從堆上現存的資料後面的那些位元組中獲得附加的位元組,如果資料後面的位元組不夠,堆上第乙個有足夠大小的自由塊,現存的資料然後就被拷貝至新的位置,而老塊則放回到堆上,資料可能被移動

2.銷毀空間

free

c語言中的 free 是用來釋放記憶體空間的,釋放的是指標所指向的記憶體空間,釋放完之後要將將指標賦null,避免出現野指標,有的記憶體空間是不能被釋放的,如常量區,會導致宕機

3. 區別

(1)函式 malloc不能初始化所分配的記憶體空間,而函式 calloc 能,使用 malloc() 函式的程式開始時(記憶體空間還沒有被重新分配)能正常進行,經過一段時間(記憶體被重新分配)可能會出現問題

(2)函式 calloc() 會將所分配的記憶體空間中的每一位都初始化為零,字元型別或整數型別的元素分配記憶體會被初始化為0,指標型別的元素分配記憶體會被初始化為空指標,實型資料分配記憶體會被初始化為浮點型的零

(3)realloc 可以對給定的指標所指的空間進行擴大或者縮小,無論是擴張或是縮小,原有記憶體的中內容將保持不變,縮小的那一部分的內容會丟失;realloc並不保證調整後的記憶體空間和原來的記憶體空間保持同一記憶體位址,返回的指標很可能指向乙個新的位址

二、c++動態記憶體管理

1. new/delete 基本操作

void test()

2. new/delete操作內建型別自定義型別

對於內建型別,我們可以從上圖看出c和c++並沒有什麼不同,c++為什麼要有new呢?通過下面的這段**來了解一下

在c語言中,只是開闢空間,而c++是開闢空間+初始化的,再來看一下delete

delete是先呼叫析構函式進行空間清理,然後釋放空間,而free只是釋放空間 

注意:一定要匹配使用,對於自定義型別,不匹配使用程式會崩潰,對於內建型別,free不會呼叫析構函式

3. new和delete實現原理

首先來看一下operator new與operator delete

void *__crtdecl operator new(size_t size) _throw1(_std bad_alloc)

return (p);

}

operator new:通過malloc來申請空間,當malloc申請空間成功時直接返回;如果申請記憶體失敗了,會在part1丟擲bad_alloc 型別異常申請空間失敗,嘗試執行空間不足應對措施,如果改應對措施使用者設定了,則繼續申請,否則拋異常。

void operator delete(void *puserdata)

operator delete: 通過free來釋放空間的

(1)內建型別

new和malloc,delete和free基本類似,不同的地方是:new/delete申請和釋放的是單個元素的空間,new和delete申請的是連續空間,而且new在申請空間失敗時會拋異常, malloc會返回null

(2)自定義型別

a.new 和new t

對於new,會呼叫operator new函式申請空間,然後在申請的空間上執行建構函式,完成物件的構造;對於new t,會呼叫operator new函式,operator new 是呼叫n次operator new函式完成物件空間的申請,然後在申請的空間上執行n次建構函式。

b. delete 和delete

對於delete,首先執行析構函式,完成物件中資源的清理工作,然後呼叫operator delete函式釋放物件的空間;delete 和new t 類似,執行n次析構函式,完成對n個物件資源的清理,然後呼叫operator delete(在operator delete中呼叫operator delete來釋放空間)。

三、c和c++ 記憶體管理的區別

c++c

性質 new/delete是操作符

malloc/free是函式

初始化new 可以初始化

malloc 不可以初始化

是否呼叫建構函式和析構函式

new 在使用時會呼叫malloc先開空間在呼叫建構函式進行初始化,delete會先呼叫析構函式清理物件,然後在呼叫free釋放空間

開闢空間的位置

new是在自由儲存區

malloc在堆上開空間

開闢空間大小

new只需要型別名

malloc開空間的時候需要指定空間的大小

開闢空間的不同

new 給物件陣列開空間使用new,對應釋放使用delete

malloc開闢的空間可以給單個物件使用,也可以給物件陣列使用,由free釋放交給

成功返回值

new 申請物件空間成功後返回物件指標,失敗會拋異常

malloc申請空間成功返回void*的指標,失敗返回null

擴容new不可以

malloc開闢的空間如果不夠用可以使用realloc來擴大空間

C 動態記憶體管理

我們都知道在c 中可以用new malloc動態分配記憶體空間,delete free釋放動態開闢的記憶體空間。1.那麼既然c 中有了可以動態開闢記憶體的函式為什麼又要有new delete呢?c 中的malloc free是繼承c語言中的malloc free,它的用法和在c語言中的用法一模一樣。...

C 動態記憶體管理

1 總結並剖析malloc free和new delete之間關係和差異。1 他們都是動態記憶體管理的入口 2 malloc要計算空間大小,返回值要強轉 new自動計算位元組大小,返回值是相應型別的指標 3 malloc只開闢空間 new開闢空間 呼叫建構函式初始化 delete呼叫析構函式清理 釋...

c 動態記憶體管理

c語言動態記憶體管理 c中關於動態記憶體的標準庫函式 malloc calloc realloc free 以下是關於這幾個函式的介紹 1 malloc 用於動態開闢記憶體 堆空間 返回型別為void 引數 size t size 是無符號整型表示要開闢的空間大小,單位是位元組,2 calloc 用...