一、什麼是堆?
堆(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接口。
四、堆的優點和劣勢(管理大塊內存、靈活、容易內存泄漏)
優點:靈活
劣勢:須要程序員去處理各類細節,因此容易出錯,嚴重依賴於程序員的水平。程序員