堆記憶體管理

2021-09-25 23:07:07 字數 2394 閱讀 7308

堆記憶體是**段當中的其中一段,特點就是大,但不能與識別符號建立聯絡,只能與指標配合使用

c語言沒有提供管理堆記憶體的語句,而是標準庫提供了一套管理記憶體的函式

功能:從堆記憶體中分配記憶體

引數

size 所申請的位元組數,一般使用 sizeof 計算

返回值:所申請的記憶體的首位址

注意

1、如果申請記憶體失敗或者size = 0,返回值為null或最後能夠被成功free的值

2、所申請的記憶體沒有初始化,記憶體是不確定的

int* p = malloc(4);

// 申請4個位元組的位址,返回首位元組的位址

// 有時相當於申請了乙個陣列arr[1]

功能:釋放堆記憶體

引數

ptr -> 需要被釋放的記憶體的首位址

注意

1、如果ptr的值不是malloc的返回值,可能會出現記憶體崩潰

2、寫完申請語句就要立刻寫釋放語句,釋放後指標的值立即滯空

int* p = malloc(4);

……free(p); // 釋放完後是野指標

p = null; // 變成空指標,比較安全

功能:從堆記憶體中申請記憶體

引數

nmemb -> 申請多塊記憶體

size -> 申請每塊記憶體的位元組數

返回值:所申請的記憶體的首位元組

注意: 所申請的記憶體會被初始化為0,如果申請記憶體失敗或者nmemb、size的值為0,返回值為null

malloc vs calloc

// void *malloc(size_t 500*4);  ==  void *calloc(size_t 500, size_t 4);

// 每塊4位元組,申請500次

calloc的引數更清晰,記憶體會被初始化

malloc的速度更快(calloc每次都初始化,拖速度)

功能:調整已經申請到的記憶體的大小

引數

ptr ->已經申請到的記憶體的首位址

size ->調整後的大小

返回值:調整後的記憶體首位址

注意: 該函式既有申請記憶體的功能,也有釋放記憶體的功能

ptr = null,size > 0,則是申請記憶體的功能(相當於malloc)

ptr = 某值有意義,size = 0,則是把某塊記憶體的大小調整為0,相當於釋放記憶體

返回值要重新接收

// 若後續有再申請記憶體,且前塊記憶體調整位置不夠,realloc會先將要調整的記憶體複製到空位,再把原記憶體釋放掉,故記憶體首位址可能發生改變,需要重新接收

功能:把指定記憶體中的資料設定為0

引數

s ->記憶體(被初始化)的首位址

n ->記憶體的大小(需要初始化的位元組數)

無返回值

功能:把指定的記憶體以位元組為單位設定為指定的值

引數

s ->記憶體(被初始化)的首位址

c ->位元組中儲存的資料

// c引數的型別 int 具有迷惑性,實際值的範圍小於255

#include #include #include int main()

}// 因為是以位元組為單位,故列印值為00000001 00000001 00000001 00000001的十進位制轉化

n ->記憶體的大小(需要初始化的位元組數)

返回值:設定後的記憶體首位址

返回值的作用:鏈式呼叫(把函式的返回值當作另乙個函式的引數,以此達到精簡**的目的

int* p = malloc(4);

realloc(memset(p,1,4),8);

無型別指標(萬能指標)

不能解引用,必須先轉換成其它有效型別再解引用

void* 可以自動轉換成任意型別指標

任意型別的指標也可以自動轉化成 void*

:c語言中可以自動轉換,但c++要手動

堆記憶體的管理

1.1 對於堆的管理,核心提供了兩個系統呼叫brk和mmap。brk 用於更改堆頂位址,mmap則為程序分配虛擬位址空間。1.2 當程序向glibc申請記憶體時,如果申請的記憶體的數量大於閥值的時候,glibc會採用mmap為程序分配一塊虛擬位址空間,而不是採用brk來擴充套件棧頂的指標。1.2.1...

堆與記憶體管理

當程式對堆的操作比較頻繁的時候,使用系統呼叫的方式向核心索要空間的代價太大。比較好的做法是向作業系統申請一塊適當大小的額堆空間,然後又程式自己管理這塊空間,所以管理空間分配的往往時程式的執行庫。執行庫相當於零售商,從核心批發了較大的堆空間,然後零售給程式使用。linux下的程序堆管理提供了兩種堆空間...

堆記憶體和棧記憶體的管理

1 堆記憶體 堆記憶體是由程式設計師手工管理的,但它的申請是需要借助標準庫函式。在大小上,理論上是物理記憶體的大小。關於堆記憶體的資料儲存是靠程式設計師來管理的。由於是由程式設計師管理的,程式設計師的錯誤操作也導致記憶體的洩露和記憶體碎片的問題。關於堆記憶體的標準庫函式 stdlib.h mallo...