C C 動態記憶體管理 1

2021-08-22 06:34:30 字數 2435 閱讀 6304

c和c

++的記憶體管理裡面最複雜的恐怕是動態記憶體管理部分了

,也就是c裡的

malloc

和c++

裡的operator new.

他們的作用我就不羅嗦了

.我只講講它們是怎麼實現的.

雖然沒有標準規定

, 但是

opertor

new很有可能是用

malloc

實現的,

至少ms

的crt

是這樣.

不過可以肯定

,malloc

不會用operator new

實現. 所以,

我就講講

malloc

和free

的實現.

malloc

和free都是c

的庫函式

,所以先從

c的函式開始分析

.一直到呼叫作業系統核心的服務為止.

windos 2000/xp

的malloc

windows下,

就是微軟的

crt庫了,其實

ms的crt裡的

malloc

實現很簡單

,就是對

windows

的堆(heap)

處理api

做了封裝.因為

windows

自己提供了堆管理的功能,所以

malloc

就不用自己再寫一套了

.稍微說一下

,debug

版的crt

庫里, malloc

還是做了些東西的

,它把從heapalloc中得到的記憶體用乙個雙向鍊錶連起來

,每個節點除了記錄使用者需要的記憶體空間外

,還記錄了申請記憶體的語句的檔名和行數

,記憶體大小等資訊

,這使得

debug

的時候能夠報告記憶體洩漏

.還有其他一些檢測措施

,可以發現指標越界和訪問已經釋放的記憶體這樣的錯誤.

heapalloc是

kernel32.dll

提供的函式

,這個函式其實還是個包裝

,做了簡單的檢查後,呼叫

rtlallocateheap.

rtlallocateheap是

ntdll.dll

提供的函式

,這個函式才是真正幹活的函式.它是

nt的堆管理器的乙個函式

.nt的堆管理器的記憶體就是從zwqueryvirtualmemory獲取了

,這個函式還是

ntdll

提供的,

這個函式的過程更簡單

,直接就

sysenter

進核心了

, 呼叫的是

ntoskrnl

.exe

的記憶體管理模組裡的函式了

,應該就是ntallocatevirtualmemory.

.到此,windows

的malloc

分析完成

.具體細節後面講演算法的時候再說

.總結一下

, windows

下的crt

的動態記憶體管理層次結構如圖1所示

圖1 windows的c

執行庫記憶體管理層次

linux

的malloc

linux

的crt

就是glibc了.

因為linux

沒有提供現成的堆管理功能,所以

glibc

自己實現了動態記憶體管理功能

.也就是說

glibc

的malloc

/free

實現了一套和

windows

的ntdll

裡的rtlallocateheap

/rtlfreeheap

類似的功能

. malloc

獲取記憶體是用的

linux

的系統呼叫

mmap

和sbrk. linux

的記憶體管理層次就比

windows

簡單的多.

通過簡要了解兩個流行的作業系統裡

malloc

的實現架構

. 可以看到

,windows的c

執行庫動態記憶體分配演算法在

ntdll

.dll

的堆管理器

heap.c

裡實現, linux 的c

執行庫動態記憶體分配演算法在

glibc

的malloc.c

裡實現.

接下來就是分析這兩套函式了.

C C 動態記憶體管理

一 c語言中動態記憶體管理方式 c語言中使用 malloc calloc realloc free進行記憶體的管理和釋放 1.malloc動態記憶體申請 int ptest int malloc 10 sizeof int 申請記憶體的方式 free 釋放 2.calloc 該函式會將申請的記憶體空...

C C 動態記憶體管理

注意malloc free new delete new delete一定要匹配使用,否則可能出現記憶體洩漏甚至崩潰的問題小結 1 兩組函式都負責動態記憶體管理 2 malloc free是c c 標準庫的函式,而new delete是c 操作符。3 malloc free只負責動態分配空間 釋放空...

C C 動態記憶體管理

c語言動態記憶體管理 malloc calloc realloc free int p1 int malloc sizeof int malloc返回值型別為void int p2 int calloc 1,sizeof int 動態分配並初始化為0 int p3 int realloc p1,si...