C語言free函數的原理——————————【Badboy】,free函數badboy

來源:互聯網
上載者:User

C語言free函數的原理——————————【Badboy】,free函數badboy

    今天在網上看到了這樣一個問題,“如果malloc 了一塊字串的記憶體,然後,它改變了這個字串的大小,問會不會有一部分記憶體沒有被釋放掉。”這個問題,以前的確沒有仔細想過。

  當然,我覺得是肯定會釋放掉的,但是一直沒有瞭解過free 的原理,不敢亂說。我看了一下作業系統的記憶體管理,基本上是這樣的,當然各個系統的實現不一樣。

  作業系統管理記憶體,維護了一個空閑記憶體鏈表,malloc從個鏈表中選出一個來使用,每個記憶體塊都有一個頭部來表示這個記憶體的基本資料,如記憶體大小,

  所以free 時候 能夠記住原來指標所指的記憶體大小,而不是用記憶體塊中是否有 \0 來臨時計算指向記憶體的大小,不要字串的計算長度的方法所誤導。

  還有一點要注意的就是,系統在free 記憶體的時候,記住的只是 malloc 時候的地址,和 分配記憶體的大小。

  比如 char *p = (char *)malloc(10); 就會產生分配10個 位元組。如果 你把指標的地址改變了 p = p + 1; 然後 free 就要出問題了。程式會崩潰。

  如果一定要改變指標的值,建議這樣做 char *newp = p; 然後 改變 newp = newp + 1 , 最後 free(p);

  還有一點要注意,一個長度 為10 的字串 要佔用 11個位元組。因為還有一個 '\0', 所以分配記憶體的時候要分配 lenght + 1 的大小。


對於C語言中free函數的問題

要free的話首先那塊空間得是malloc, calloc, realloc...開闢出來的記憶體空間, free多少取決於當時alloc出多少.
char* a = (char*)malloc(x*y*sizeof(char));//開闢了x*y個char的空間,(這裡是二維的,如果多維就是要多少,開多少);
//相當於a[x][y];
//但是malloc出的空間是堆區的,而數組是在棧區的;兩者都是連續的空間;棧空間是有限的,一般會是1k;堆空間相對多些;
......//使用這塊空間;

free(a);// 釋放空間;
 
C語言中free函數的用法

一、malloc()和free()的基本概念以及基本用法:
1、函數原型及說明:
void *malloc(long NumBytes):該函數分配了NumBytes個位元組,並返回了指向這塊記憶體的指標。如果分配失敗,則返回一個null 指標(NULL)。
關於分配失敗的原因,應該有多種,比如說空間不足就是一種。
void free(void *FirstByte): 該函數是將之前用malloc分配的空間還給程式或者是作業系統,也就是釋放了這塊記憶體,讓它重新得到自由。
2、函數的用法:
其實這兩個函數用起來倒不是很難,也就是malloc()之後覺得用夠了就甩了它把它給free()了,舉個簡單例子:
// Code...
char *Ptr = NULL;
Ptr = (char *)malloc(100 * sizeof(char));
if (NULL == Ptr)
{
exit (1);
}
gets(Ptr);
// code...
free(Ptr);
Ptr = NULL;
// code...
就是這樣!當然,具體情況要具體分析以及具體解決。比如說,你定義了一個指標,在一個函數裡申請了一塊記憶體然後通過函數返回傳遞給這個指標,那麼也許釋放這塊記憶體這項工作就應該留給其他函數了。
3、關於函數使用需要注意的一些地方:
A、申請了記憶體空間後,必須檢查是否分配成功。
B、當不需要再使用申請的記憶體時,記得釋放;釋放後應該把指向這塊記憶體的指標指向NULL,防止程式後面不小心使用了它。
C、這兩個函數應該是配對。如果申請後不釋放就是記憶體泄露;如果無故釋放那就是什麼也沒有做。釋放只能一次,如果釋放兩次及兩次以上會
出現錯誤(釋放null 指標例外,釋放null 指標其實也等於啥也沒做,所以釋放null 指標釋放多少次都沒有問題)。
D、雖然malloc()函數的類型是(void *),任何類型的指標都可以轉換成(void *),但是最好還是在前面進行強制類型轉換,因為這樣可以躲過一
些編譯器的檢查。
 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.