對malloc使用的一點新理解,malloc使用理解
昨日在子函數中用malloc申請內存使用後,意外發現在free的時候出現異常錯誤,後經檢查發現原來是實際使用時指針長度超過了申請的范圍。
現總結一些使用malloc時要注意的地方:
1,不要Free二次,配套使用。否則當free第一次的時候沒有問題,第二次的時候就是在free一個野指針了,程序也不知道你到底在free什麼東西。
2,不要跨進程分配和釋放;
不要free多次或0次;
注意判斷分配是否成功;
3,對於malloc()和free()需要注意的,補充一句,為了確保對於一個有效指針只free一次,所以應該在malloc返回失敗、free指針以後都因該把指針置空,而在free前應該判斷指針是否為空!只要按照這種方式去寫代碼應該是沒問題的!當指針置空後你愛怎麼free都沒事。
4,在一個函數裡邊malloc了一個指針,然後返回值是這個指針,也需要free。
5,指向malloc申請的堆內存的指針,在運用過程中千萬不要另付值,否則同樣導致內存洩露。比如我*p=(char*)malloc(sizeof(char)*100);然後我進行p++,再free(p);這樣是會出問題的。free()傳入的參數必須是內存段的頭指針,如果你給程序的東西不是牛頭不對馬嘴,它肯定要跟你鬧矛盾。
6,malloc後,實際使用時指針長度超過了你申請的范圍,當再去free時肯定出問題!其實很好理解,你申請了十塊大洋,你買不了十一塊大洋的東西。
其實這兩個函數用起來倒不是很難,也就是malloc()之後覺得用夠了就甩了它把它給free()了,舉個簡單例子:
1 // Code...
2 char *Ptr = NULL;
3 Ptr = (char *)malloc(100 * sizeof(char));
4
5 if (NULL == Ptr)
6 {
7 exit (1);
8 }
9
10 gets(Ptr);
11
12 // code...
13
14
15 free(Ptr);
16
17 Ptr = NULL;
18
19 // code...
最後貼上昨天在知乎給遇到相同問題的同學的解答:
https://www.zhihu.com/question/38970898/answer/125534251