free函式的詳解

2021-08-06 05:30:15 字數 2288 閱讀 8191

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