1、函式原型及說明:
void *malloc(long numbytes):該函式分配了numbytes個位元組,並返回了指向這塊記憶體的指標。如果分配失敗,則返回乙個空指標(null)。
關於分配失敗的原因,應該有多種,比如說空間不足就是一種。
void free(void *firstbyte): 該函式是將之前用malloc分配的空間還給程式或者是作業系統,也就是釋放了這塊記憶體,讓它重新得到自由。
2、函式的用法:
其實這兩個函式用起來倒不是很難,也就是malloc()之後覺得用夠了就甩了它把它給free()了,舉個簡單例子:
// code...
char *ptr = null;
ptr = (char *)malloc(100 * sizeof(char));
if (null == ptr)
gets(ptr);
// code...
free(ptr);
ptr = null;
// code...
就是這樣!當然,具體情況要具體分析以及具體解決。比如說,你定義了乙個指標,在乙個函式裡申請了一塊記憶體然後通過函式返回傳遞給這個指標,那麼也許釋放這塊記憶體這項工作就應該留給其他函式了。
3、關於函式使用需要注意的一些地方:
a、申請了記憶體空間後,必須檢查是否分配成功。
b、當不需要再使用申請的記憶體時,記得釋放;釋放後應該把指向這塊記憶體的指標指向null,防止程式後面不小心使用了它。
c、這兩個函式應該是配對。如果申請後不釋放就是記憶體洩露(什麼叫記憶體洩漏:簡單的說就是申請了一塊記憶體空間,使用完畢後沒有釋放掉。它的一般表現方式是程式執行時間越長,占用記憶體越多,最終用盡全部記憶體,整個系統崩潰。由程式申請的一塊記憶體,且沒有任何乙個指標指向它,那麼這塊記憶體就洩露了);如果無故釋放那就是什麼也沒有做。釋放只能一次,如果釋放兩次及兩次以上會出現錯誤(釋放空指標例外,釋放空指標其實也等於啥也沒做,所以釋放空指標釋放多少次都沒有問題)。
d、雖然malloc()函式的型別是(void *),任何型別的指標都可以轉換成(void *),但是最好還是在前面進行強制型別轉換,因為這樣可以躲過一些編譯器的檢查。
二、malloc()到底從**得來了記憶體空間:
1、malloc()到底從**得到了記憶體空間?答案是從堆裡面獲得空間。也就是說函式返回的指標是指向堆裡面的一塊記憶體。作業系統中有乙個記錄空閒記憶體位址的鍊錶。當作業系統收到程式的申請時,就會遍歷該鍊錶,然後就尋找第乙個空間大於所申請空間的堆結點,然後就將該結點從空閒結點鍊錶中刪除,並將該結點的空間分配給程式。
說到這裡,不得不另外插入乙個小話題,相信大家也知道是什麼話題了。什麼是堆?說到堆,又忍不住說到了棧!什麼是棧?下面就另外開個小部分專門而又簡單地說一下這個題外話:
2、什麼是堆:堆是大家共有的空間,分全域性堆和區域性堆。全域性堆就是所有沒有分配的空間,區域性堆就是使用者分配的空間。堆在作業系統對程序初始化的時候分配,執行過程中也可以向系統要額外的堆,但是記得用完了要還給作業系統,要不然就是記憶體洩漏。
這下子大家知道學作業系統的重要性了吧。
通過上面對概念的描述,可以知道:
棧是由編譯器自動分配釋放,存放函式的引數值、區域性變數的值等。操作方式類似於資料結構中的棧。
堆一般由程式設計師分配釋放,若不釋放,程式結束時可能由os**。注意這裡說是可能,並非一定。所以,一定記得要釋放!
注意它與資料結構中的堆是兩回事,分配方式倒是類似於鍊錶。
所以,舉個例子,如果你在函式上面定義了乙個指標變數,然後在這個函式裡申請了一塊記憶體讓指標指向它。實際上,這個指標的位址是在棧上,但是它所指向的內容卻是在堆上面的!這一點要注意!所以,再想想,在乙個函式裡申請了空間後,比如說下面這個函式:
// code...
void function(void)
就這個例子,千萬不要認為函式返回後,函式所在的棧被銷毀指標也跟著銷毀,申請的記憶體也就一樣跟著銷毀了!這絕對是錯誤的!因為申請的內存在堆上,而函式所在的棧被銷毀跟堆完全沒有啥關係。所以,還是那句話:記得釋放!
3、free()到底釋放了什麼
free()釋放的是指標指向的記憶體!注意!釋放的是記憶體,不是指標!這點非常非常重要!指標是乙個變數,只有程式結束時才被銷毀。例如你用free( p )釋放了記憶體空間後,原來指向這塊空間的指標還是存在!此時原本指向剛剛釋放掉了空間的指標p仍然指向了該記憶體空間,這樣一旦這段記憶體已經被別的變數使用的話,就可能誤用p來修改這裡的值,這不是我們所期望的,所以free(p)之後一定要將p = null;,這樣就萬無一失了。
因此,釋放記憶體後把指標指向null,防止指標在後面不小心又被引用了。非常重要啊這一點!
free 命令詳解
free命令可以顯示當前系統未使用的和已使用的記憶體數目,還可以顯示被核心使用的記憶體緩衝區。語法free 選項 選項 b 以byte為單位顯示記憶體使用情況 k 以kb為單位顯示記憶體使用情況 m 以mb為單位顯示記憶體使用情況 o 不顯示緩衝區調節列 s間隔秒 持續觀察記憶體使用狀況 t 顯示記...
Linux的free命令詳解
我告訴有朋友我一直用linux.他問我了一下我為什麼linux使用的記憶體這麼高.他講他1g的內在free才232m.講win xp才用200m的樣子.其實啊.linux的記憶體是很說究的.如下顯示free是顯示的當前記憶體的使用,m的意思是m位元組來顯示內容.我們來一起看看.free m tota...
linux的free命令詳解
我告訴有朋友我一直用linux.他問我了一下我為什麼linux使用的記憶體這麼高.他講他1g的內在free才232m.講win xp才用200m的樣子.其實啊.linux的記憶體是很說究的.如下顯示free是顯示的當前記憶體的使用,m的意思是m位元組來顯示內容.我們來一起看看.free m tota...