內存管理之堆heap

一、什麼是堆?
 堆(heap)是一種內存管理方式。內存管理對操做系統來講是一件很是複雜的事情,由於首先內存容量很大,
 其次就是內存需求在時間和大小塊上沒有規律(操做系統上運行着幾十甚至幾百個進程,這些進程可能隨時
 都會申請或者是釋放內存,而且申請和釋放的內存塊大小是隨意的)。
 堆這種內存管理方式的特色就是自由(隨時申請、隨時釋放、大小塊隨意)。堆內存是操做系統劃歸給堆管
 理器(操做系統中的一段代碼,屬於操做系統的內存管理單元)來管理的,而後向使用者(用戶進程)提供
 API(malloc和free)來使用堆內存。
 
 咱們何時使用堆內存?
 當咱們須要的內存容量比較大時,須要反覆使用及釋放時,不少數據結構(譬如鏈表)的實現都要使用堆內存。
 
二、堆管理內存的特色(大塊內存、手工分配&使用&釋放)
 特色一:容量不限(常規使用的需求容量均可以知足)
 特色二:申請及釋放都須要手工運行,手工進行的含義就是須要程序員寫代碼明確進行申請malloc及釋放free。
 若是程序員申請內存並使用後未釋放,這段內存就丟失了(在堆管理器的記錄中,這段內存仍然屬於你這個進程,
 可是進程本身又覺得這段內存已經不用了,因此進程再次運行的時候,就又會去申請新的內存塊,這就叫作吃內存),
    稱之爲內存泄漏。在C/C++語言中,內存泄漏是最嚴重的程序bug,這也是別人認爲Java/C#等語言比C/C++優秀的地方。
三、C語言操做堆內存的接口(malloc free)
    堆內存釋放的時候最簡單,直接調用free釋放便可。  void free(void *ptr);
 堆內存申請時,有3個可選擇的相似功能的函數:malloc ,calloc, realloc
 void *malloc(size_t size);
 void *calloc(size_t nmemb, size_t size);     //nmemb個單元,每一個單元size字節
 void *realloc(void *ptr, size_t size);       //改變原來申請的空間的大小的
 
 譬如要申請10個int元素的內存:
 malloc(40);           malloc(10 * sizeof(int));
 calloc(10, 4);        calloc(10, sizeof(int));
 
 數組定義時必須同時給出數組元素個數(數組大小),並且一旦定義在沒法更改。
 堆內存在申請時必須給定大小,而後一旦申請完成大小不變,若是要變只能經過realloc接口。
四、堆的優點和劣勢(管理大塊內存、靈活、容易內存泄漏)
 優點:靈活
 劣勢:須要程序員去處理各類細節,因此容易出錯,嚴重依賴於程序員的水平。程序員

相關文章
相關標籤/搜索