Firefox 程序员 Windows Android java centos wordpress 开源 Python google php shell Ubuntu apache 微软 编程 nginx linux mysql 云计算

内存管理函数malloc和free

  在單片機上經常會需要用到像標準c庫中的內存分配,可是單片機並沒有內存管理機制,如果直接調用庫函數(malloc,free...),會導致內存碎片越用越多,很容易使系統崩潰掉,這裏分享一個自己寫的適用於單片機的內存分配方法,具備輕量級的內存管理能力,有效減少內存碎片,提高單片機系統工作穩定性。

  如下圖,heap_start開始的地方,是我們存放用戶數據的地方,在heap_end之前都是大小固定的一個個內存管理塊,內存管理塊用於記錄每次用戶申請內存的地址、大小、釋放情況。在malloc時,會優先選擇和用戶申請空間最相當的內存塊,以減少內存碎片產生。在free的內存塊時,如果遇到相鄰內存塊均為空閑塊時,便會將幾塊相鄰的內存塊合並成一塊,以減少內存碎片。

void *malloc(long NumBytes):該函數分配了NumBytes個字節,並返回了指向這塊內存的指針。如果分配失敗,則返回一個空指針(NULL)。

關於分配失敗的原因,應該有多種,比如說空間不足就是一種。

void free(void *FirstByte): 該函數是將之前用malloc分配的空間還給程序或者是操作系統,也就是釋放了這塊內存,讓它重新得到自由。

2、函數的用法:

  其實這兩個函數用起來倒不是很難,也就是malloc()之後覺得用夠了就甩了它把它給free()了

malloc()到底從哪裏得到了內存空間?答案是從堆裏面獲得空間。也就是說函數返回的指針是指向堆裏面的一塊內存。操作系統中有一個記錄空閑內存地址的鏈表。當操作系統收到程序的申請時,就會遍歷該鏈表,然後就尋找第一個空間大於所申請空間的堆結點,然後就將該結點從空閑結點鏈表中刪除,並將該結點的空間分配給程序。就是這樣!

棧是由編譯器自動分配釋放,存放函數的參數值、局部變量的值等。操作方式類似於數據結構中的棧。

  堆一般由程序員分配釋放,若不釋放,程序結束時可能由OS回收。註意這裏說是可能,並非一定。所以我想再強調一次,記得要釋放!

  註意它與數據結構中的堆是兩回事,分配方式倒是類似於鏈表。(這點我上面稍微提過)

 所以,舉個例子,如果你在函數上面定義了一個指針變量,然後在這個函數裏申請了一塊內存讓指針指向它。實際上,這個指針的地址是在棧上,但是它所指向的內容卻是在堆上面的!這一點要註意!所以,再想想,在一個函數裏申請了空間後,

延伸阅读

评论