C和指標 第11章 動態記憶體分配

2021-08-19 17:12:42 字數 1019 閱讀 7144

2.記憶體分配

void *malloc( size_t size );

void free( void *pointer);

malloc(stdlib.h)的引數是需要分配的記憶體位元組(字元)數。如果記憶體池的可用記憶體可用滿足這個需求,返回乙個指向被分配的連續的記憶體塊的起始位置的指標。如果記憶體池為空,或者可用記憶體不足滿足要求,作業系統會返回乙個乙個null指標。對於要求邊界對齊的機器,malloc返回的記憶體的起始位置將始終滿足對邊界對齊要求最嚴格的型別的要求。

free的引數只能是null或malloc、calloc、realloc返回的值。向free傳遞乙個null引數不產生任何效果。

3.calloc和realloc

void *calloc( size_t num_elements, size_t element_size );

void *realloc( void *ptr, size_t new_size );

calloc的第乙個引數為所需元素的數量,第二個引數為單個元素的位元組數,其與malloc的最大區別在於calloc會在返回指向記憶體塊的指標之前將記憶體塊初始為0。

realloc用於修改乙個原先已經分配的記憶體塊的大小。如果用於擴大記憶體塊,那麼這個記憶體塊原先的內容將保留,新新增的記憶體新增到原先記憶體塊的後面,新記憶體不以任何方式初始化;如果用於縮小記憶體塊,該記憶體塊尾部的部分便被拿掉,但剩餘的記憶體塊的原先內容將保留;如果原先記憶體塊無法改變大小,realloc將分配另一塊正確大小的記憶體,並將原先記憶體塊的內容複製到新的記憶體塊上。如果第一引數為null,則行為與malloc一模一樣。

5.常見動態記憶體錯誤

注意:1.對null指標進行解引用

2.對分配的記憶體進行操作時越過邊界

3.釋放非動態分配的記憶體

4.試圖釋放一塊動態分配的記憶體的一部分

5.一塊動態記憶體被釋放後繼續使用

6.分配記憶體但使用完畢後不釋放(記憶體洩漏memory leak)

警告:動態記憶體分配後應檢查所請求的記憶體是否成功分配。

《C Primer》第12章 動態記憶體

shared ptr允許多個指標指向同乙個物件,unique ptr獨佔所指向的物件,用make shared函式分配動態記憶體,返回物件的shared ptr.程式使用動態記憶體的原因之一是需要在多個物件間共享資料,自己直接管理記憶體的類與使用智慧型指標的類不同,它們不能依賴類的物件拷貝 賦值和銷...

C Primer 第12章 動態記憶體

程式有3中記憶體分配方式,靜態記憶體用來儲存區域性static物件,類static資料成員以及定義在任何函式之外的物件,棧記憶體用來儲存定義在函式內的非static物件。靜態記憶體和棧記憶體中的物件由編譯器建立或銷毀。程式用堆來儲存動態分配的物件,動態物件必須顯示銷毀。動態記憶體與智慧型指標 用ne...

《C和指標》第十一章 動態記憶體分配

1.當陣列被宣告時,必須在編譯時知道它的長度。動態記憶體分配允許程式為乙個長度在執行時才知道的陣列分配記憶體空間 malloc 引數是要分配的位元組數,並返回指向該記憶體的指標 calloc 引數是需要分配的元素個數和每個元素的長度,返回指向該塊記憶體的指標,並且在返回前把記憶體初始化為零 real...