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...