malloc()、free()、calloc()、realloc()函式在標頭檔案stdlib.h中
原型:malloc()的引數是需要分配的記憶體位元組數。void *malloc(size_t size);
如果記憶體池中的可用記憶體可以滿足這個需求,maollc就返回乙個指向被分配的記憶體塊起始位置的指標(指標型別為void *)。
如果,作業系統無法向malloc提供足夠記憶體,malloc就返回乙個null指標。因此每個從malloc返回的指標都要進行檢查,確保它並非null。
例如:
#include #include int main()else
}/****輸出****
malloc(100) success!
************/
原型:calloc也用於分配記憶體。calloc的引數包括所需元素的數量和每個元素的位元組數。除引數設定於malloc不同外,calloc在分配記憶體時會自動將儲存空間置初值0;void *calloc( size_t num_elements, size_t element_size);
例如:
#include #include int main()else
}/****輸出****
calloc(4, 10) success !
************/
原型:realloc()函式用於修改乙個原先已經分配的記憶體的大小。第乙個引數為需要改變記憶體大小的指標名,第二個引數為新分配記憶體的大小。void * realloc( void *ptr,size_t new_size)
使用這個函式,你可以使一塊記憶體擴大或縮小。
如果它用於擴大乙個記憶體塊,那麼這塊記憶體原先的內容依然保留,新增的記憶體新增大原先記憶體塊的後面。
如果用於縮小乙個記憶體塊,該記憶體尾部的部分記憶體便被拿掉,剩餘部分記憶體的原先內容依然保留。
如果原先的記憶體塊無法改變大小,realloc()將分配另一塊正確大小的記憶體,並把原先那塊記憶體的內容複製到新的塊上。
因此,在使用realloc之後,就不能再使用舊記憶體的指標,而是應該使用realloc()所返回的新指標。 realloc()失敗的時候,返回null。若realloc的乙個引數為null,那麼他的行為就和malloc一樣。若第二個引數為0,則效果等同於free()。
原型:free函式用於釋放記憶體。引數表示malloc()、calloc()、realloc()返回的位址。若引數等於null,則free不會產生任何效果。free函式無返回值。void free(void *ptr)
c++中動態記憶體建立new分為兩個步驟:
new 實際上總以標準c中的malloc()完成。
例如:
int *q = new
int;
//申請記憶體存入數值888
int *r = new
int(888);
delete operator也相應地分為兩步:
int *r = new
int(888);
delete r;
使用原則:
- 不要用delete來釋放不是new分配的記憶體。
- 不要使用delete來釋放同一記憶體兩次。
- 如果在new表示式中使用,必須在相應的delete表示式中也使用。如果在new表示式中不使用,一定不要在相應的delete表示式中使用。
C C 程式設計之記憶體管理
1 從 全域性 靜態儲存區域分配 內存在程式編譯的時候就已經分配好,這塊內存在程式的整個執行期間都存在,例如,全域性變數,靜態變數。2 常量儲存區 儲存程式中的常量。3 棧區 在執行函式時,函式內區域性變數的儲存單元都可以在棧上建立,函式執行結束後這些儲存單元自動被釋放。棧記憶體分配運算內置於處理器...
C C 程式設計之記憶體管理
記憶體分配方式 c語言中記憶體分配方式 1 從 全域性 靜態儲存區域分配 內存在程式編譯的時候就已經分配好,這塊內存在程式的整個執行期間都存在,例如,全域性變數,靜態變數。2 常量儲存區 儲存程式中的常量。3 棧區 在執行函式時,函式內區域性變數的儲存單元都可以在棧上建立,函式執行結束後這些儲存單元...
linux記憶體管理之記憶體分配函式區別
使用者 核心 api名稱 物理連續?大小限制 單位場景 使用者空間 malloc calloc realloc free 不保證堆申請 位元組calloc初始化為0 realloc改變記憶體大小。alloca 棧申請位元組 向棧申請記憶體 mmap munmap 將檔案利用虛擬記憶體技術對映到記憶體...