參考:
一、malloc和free
1、函式宣告:
void *malloc(int size);
說明:malloc向系統申請分配size位元組的記憶體空間,返回型別為void*型別;
2、使用
int
* p;
p =(
int*
)malloc
(sizeof
(int))
;free
(p);
//釋放記憶體
malloc函式使用注意:
1)、malloc返回的是不確定型別的指標,因此在返回前需要做強制型別轉換,否則將編譯錯誤;
2)、malloc只管分配記憶體,並不會初始化,其記憶體空間中的值可能是隨機的。如果分配的這塊空間原來沒有被使用過,那麼其中每個值都可能是0。相反,空間裡面可能遺留各種各樣的值。
3)、實參為需要分配的位元組大小,如果malloc(1),那麼系統只分配了1個位元組的記憶體空間,這時注意,如果在這塊空間中存放乙個int值,由於int型別佔4個位元組,那麼還有3個位元組未分配空間,系統就會在已經分配的那1個位元組的基礎上,依次向後分配3個位元組空間,而這就占有了「別人」的3個位元組空間,「別人」原有的值就被清空了。
4)、分配的空間不再使用時,要用free函式釋放這塊記憶體空間。
5)、釋放的是指標指向的記憶體空間而不是指標本身,釋放後指標仍然存在,(諸如像指標這種變數,只有在程式結束時才會被銷毀)如:
int
* p;
p =(
int*
)malloc
(sizeof
(int))
;free
(p);
int a =10;
p =&a;
//指標依舊存在且可以被賦值
3、malloc函式工作機制
1)malloc函式被呼叫時,malloc函式沿空閒鍊錶(存在於記憶體的堆裡)尋找乙個滿足需求的記憶體塊,然後把所需大小的記憶體塊分配給使用者,剩下的返回到鍊錶上。
2)呼叫free函式時,它將使用者釋放的記憶體塊連線到空閒鏈上。
3)在malloc函式被呼叫或多次呼叫後,空閒鍊錶會被分成很多小的記憶體片段,當使用者申請一塊較大的記憶體空間時,空閒鍊錶上可能沒有滿足需求的記憶體塊了,這時,malloc函式請求延時,並將空閒鍊錶內的小記憶體片段整理成大的記憶體塊,最終返回。
4)如果無法獲得符合要求的記憶體塊,malloc函式會返回null指標,因此在呼叫malloc動態申請記憶體塊時,一定要進行返回值的判斷。
二、new和delete
1、new
1)格式:
new 型別名t(初始化引數列表)
2)功能:
在程式執行期間,申請用於存放t型別物件的記憶體空間,並依初始值列表賦以初值。
3)結果:
成果-》t型別的指標指向新分配的記憶體;
失敗-》丟擲異常。
例:
//開闢單位址空間
int*p =
newint
;//開闢大小為sizeof(int)空間
int*q =
newint(5
);//開闢大小為sizeof(int)的空間,並初始化為5。
//開闢陣列空間
//一維
int*a =
newint
[100];
//開闢大小為100的整型陣列空間,並初始化為0。
//二維
int(
*a)[6]
=new
int[5]
[6];
//三維
int(
*a)[5]
[6]=
newint[3
][5]
[6];
//四維及以上以此類推。
2、delete
1)格式:
delete 指標p
2)功能:
釋放指標p所指向的記憶體
p必須是new操作的返回值
3)例:
//釋放單個int空間
int*a =
newint
;delete a;
//釋放int陣列空間
int*b =
newint[5
];delete
b;
三、兩者區別
1、屬性
new和delete是c++關鍵字,需要編譯器支援;malloc和free是庫函式,需要標頭檔案支援。
2、引數
使用new操作符申請記憶體分配時無須指定記憶體塊的大小,編譯器會根據型別資訊自行計算。而malloc則需要顯式地指出所需記憶體的尺寸。
3、返回型別
new操作符記憶體分配成功時,返回的是物件型別的指標,型別嚴格與物件匹配,無須進行型別轉換,故new是符合型別安全性的操作符。而malloc記憶體分配成功則是返回void * ,需要通過強制型別轉換將void*指標轉換成我們需要的型別。
4、自定義型別
new會先呼叫operator new函式,申請足夠的記憶體(通常底層使用malloc實現)。然後呼叫型別的建構函式,初始化成員變數,最後返回自定義型別指標。delete先呼叫析構函式,然後呼叫operator delete函式釋放記憶體(通常底層使用free實現)。
malloc/free是庫函式,只能動態的申請和釋放記憶體,無法強制要求其做自定義型別物件構造和析構工作。
5、過載
c++允許自定義operator new 和 operator delete 函式控制動態記憶體的分配。
6、記憶體區域
new做兩件事:分配記憶體和呼叫類的建構函式,delete是:呼叫類的析構函式和釋放記憶體。而malloc和free只是分配和釋放記憶體。
new操作符從自由儲存區(free store)上為物件動態分配記憶體空間,而malloc函式從堆上動態分配記憶體。自由儲存區是c++基於new操作符的乙個抽象概念,凡是通過new操作符進行記憶體申請,該記憶體即為自由儲存區。而堆是作業系統中的術語,是作業系統所維護的一塊特殊記憶體,用於程式的記憶體動態分配,c語言使用malloc從堆上分配記憶體,使用free釋放已分配的對應記憶體。自由儲存區不等於堆,如上所述,布局new就可以不位於堆中。
7、分配失敗
new記憶體分配失敗時,會丟擲bac_alloc異常(要用try-catch)。malloc分配記憶體失敗時返回null。
8、記憶體洩漏
記憶體洩漏對於new和malloc都能檢測出來,而new可以指明是哪個檔案的哪一行,malloc確不可以。
malloc和new動態分配這些事
未完待續 malloc 是c語言中動態儲存管理的一組標準庫函式之一。其作用是在記憶體的動態儲存區中分配乙個長度為size的連續空間。其引數是乙個無符號整形數,返回值是乙個指向所分配的連續儲存域的起始位址的指標。還有一點必須注意的是,當函式未能成功分配儲存空間 如記憶體不足 就會返回乙個null指標。...
mallco動態分配 malloc動態分配多維陣列
下面試自己寫的三個測試程式,如果看懂了基本上動態分配多維陣列就沒什麼問題啦 重點 1 深刻理解多維陣列的概念,多維陣列在記憶體中的分配情況,基本上動態分配也沒什麼問題的。然後還要注意一點的就是,釋放是分配的逆過程!include include include void main void int ...
C語言如何動態分配空間 malloc
一般的變數在定義是就要確定大小,但是有的時候不知道使用者的需要,就比如說排序,你不知道使用者想要給幾個數排序,所以為了保險起見往往是定義乙個很大的變數,而實際上使用者可能只需要給5個數排序,你卻int k 1024 來存放要排序的數,造成極大的浪費。這裡介紹乙個函式用於動態分配空間 malloc 原...