1. malloc
void
*malloc
(size_t size)
;
用來向記憶體申請一塊連續可用的空間,並返回指向這塊空間的指標
1)開闢成功,返回乙個指向開闢好空間的指標;開闢失敗,返回乙個null指標,因此malloc的返回值一定要用assert檢查
2)返回值是void*,所以malloc函式並不知道開闢空間的型別,具體在使用的時候使用者自己來決定
3)如果引數size為0,malloc的行為是標準未定義的,取決於編譯器
2. free
void
free
(void
* ptr)
;
用來釋放動態開闢的記憶體
1)如果引數 ptr 指向的空間不是動態開闢的,那free函式的行為是未定義的。
2)如果引數 ptr 是null指標,則函式什麼事都不做。
3. calloc
void
*calloc
(size_t num, size_t size)
;
函式功能是為num個大小為size的元素開闢空間,並把空間的每個位元組初始化為0
4. realloc
void
*realloc
(void
* ptr, size_t size)
;// ptr是要調整的記憶體位址
// size是調整之後的新大小
// 返回值為調整之後的記憶體起始位置
realloc在調整記憶體空間存在兩種情況:
1)原有空間之後有足夠大的空間:要擴充套件記憶體就直接在原有記憶體之後直接追加空間,原來空間的資料不發生改變
2)原有空間之後沒有足夠大的空間:在堆空間上另找乙個合適大小的連續空間來使用。這樣函式返回的是乙個新的記憶體位址。
malloc/calloc/realloc的區別?
與函式malloc的區別只在於calloc會在返回位址前把申請的空間的每個位元組初始化為全0通過new和delete操作符進行動態記憶體管理realloc函式可以對動態開闢記憶體大小進行調整
1. new和delete操作符
1)new/delete操作內建型別
申請和釋放單個元素的空間,使用new和delete操作符,申請和釋放連續空間,使用new和delete
2)new/delete操作自定義型別
在申請自定義型別的空間時,new會呼叫建構函式,delete會呼叫析構函式
2. operator new與operator delete函式
1)operator new實際也是通過malloc來申請空間,如果malloc申請空間成功就直接返回,否則執行使用者提供的空間不足應對措施,如果使用者提供該措施就繼續申請,否則就拋異常
2)operator delete最終是通過free來釋放空間的
new/delete是如何實現的?
1)內建型別malloc/free和new/delete的區別?如果申請的是內建型別的空間,new和malloc,delete和free基本類似,不同的地方是:new/delete申請和釋放的是單個元素的空間,new和delete申請的是連續空間,而且new在申請空間失敗時會拋異常,malloc會返回null。
2)自定義型別
共同點:malloc和new的區別?都是從堆上申請空間,並且需要使用者手動釋放。
不同點:
malloc和free是函式,new和delete是操作符
malloc申請的空間不會初始化,new可以初始化
malloc申請空間時,需要手動計算空間大小並傳遞,new只需在其後跟上空間的型別即可
malloc的返回值為void*, 在使用時必須強轉,new不需要,因為new後跟的是空間的型別
malloc申請空間失敗時,返回的是null,因此使用時必須判空,new不需要,但是new需要捕獲異常
申請自定義型別物件時,malloc/free只會開闢空間,不會呼叫建構函式與析構函式,而new在申請空間後會呼叫建構函式完成物件的初始化,delete在釋放空間前會呼叫析構函式完成空間中資源的清理
malloc和free是標準庫函式,支援覆蓋;new和delete是運算子,並且支援過載。delete和delete的區別?malloc僅僅分配記憶體空間,free僅僅**空間,不具備呼叫建構函式和析構函式功能,用malloc分配空間儲存類的物件存在風險;new和delete除了分配**功能外,還會呼叫建構函式和析構函式。
malloc和free返回的是void型別指標(必須進行型別轉換),new和delete返回的是具體型別指標。
delete只會呼叫一次析構函式。什麼是記憶體洩漏?記憶體洩漏的危害?delete會呼叫陣列中每個元素的析構函式。
記憶體洩漏指因為疏忽或錯誤造成程式未能釋放已經不再使用的記憶體的情況。記憶體洩漏並不是指內存在物理上的消失,而是應用程式分配某段記憶體後,因為設計錯誤,失去了對該段記憶體的控制,因而造成了記憶體的浪費。
危害:長期執行的程式出現記憶體洩漏,影響很大,如作業系統、後台服務等等,出現記憶體洩漏會
導致響應越來越慢,最終卡死
動態記憶體管理常見面試題
學完c語言動態記憶體管理 和 c 動態記憶體管理我們就應該深入的去對比和了解兩個的特性。共同點 都是從堆上開闢空間,最後都需要手動釋放 不同點 malloc delete是標準庫函式,new delete是操作符 new建立物件時會呼叫建構函式 開空間 delete會呼叫析構函式,而malloc f...
經典筆試題 動態記憶體管理
第一題 下面程式執行的結果是?void getmemory char p void test void 答 程式崩潰。因為 getmemory 並不能傳遞動態記憶體,test 函式中的 str 一直都是 null。strcpy str,hello world 將使程式崩潰。指標變數傳參,其實是建立了...
C 動態記憶體常見面試題解析
malloc free和new delete傻傻分不清?動態記憶體管理的面試題難道你了?來看這篇文章,包你全會。1 malloc free是函式,new delete是操作符 2 malloc free不會呼叫構造 析構函式,new delete會呼叫構造 析構函式 3 malloc申請的空間不能初...