C语言中malloc函数产生的内存泄漏问题
?
一、malloc函數
? ? ? ? 使用malloc函數要注意:如果所申請的內存塊大于目前堆上剩余的內存塊(整塊),則內存分配就會失敗,函數返回值為NULL。注意這里說的是“堆上剩余內存塊”不是所有剩余內存塊之和,因為malloc函數申請的是連續的一塊內存。malloc函數申請內存有不成功的可能,那我們在使用指向這塊內存的指針時,必須用if( p!=NULL )語句上來驗證內存分配是否成功。
例子:
? ? ? ? char *p=(char *)malloc(100);
? ? ? ?假如在堆內存分配了100個字節的內存,返回這塊內存的首地址,把地址強制轉換成char *類型后賦給char *類型的指 針變量p;同時告訴我們這塊內存將用來存儲char類型的數據。只能通過指針變量p來操作這塊內存,這塊內存本身沒有名字,對它的訪問是匿名訪問。但是,不一定每次malloc函數都能成功分配到內存。
?
二、free函數
? ? ? ? 自動變量使用的內存數量在程序執行期間自動增加或減少。但是動態分配的內存數量只會增加,除非使用free函數進行釋放。
? ? ? ? free函數其實它就做了一件事:釋放該內存的使用權,也就是斷開指針變量和這塊內存的對應關系。free函數就是把這塊內存和p 之間的映射關系斷開;指針變量p本身保存的地址并沒有改變;關于free釋放該內存后,該內存中的數據,我們只能認為是臟數據;也就是說,這部分數據可能存在并且維持原來的值,也可能被清空,或者被修改為其他值,這就是free函數的功能。
?
三、內存泄漏
1、定義
? ? ? ?內存泄漏(Memory Leak)是指程序中己動態分配的堆內存由于某種原因程序未釋放或無法釋放,造成系統內存的浪費,導致程序運行速度減慢甚至系統崩潰等嚴重后果。
2、堆內存泄漏
? ? ? ? malloc申請的是堆內存,對于malloc內存泄露,只要遵循:”誰申請誰釋放,在同一函數中申請在同一函數中釋放”原則基本上可以杜絕內存泄露問題。當然,在很多情況下,不可避免地需要在不同的函數中申請和釋放,甚至需要在不同的任務中申請和釋放。這才是造成堆內存泄露的主要原因。
3、解決辦法:
? ? ? ?申請完后,需要free函數釋放內存。一個malloc對應一個free。在使用free(p) 函數內存釋放后,指針變量p本身保存的地址并沒有改變,那我們必須需重新把p的值變為NULL:p = NULL。如 果沒有把該指針置NULL,這個指針就成為了“懸空指針”,也就是野指針,這也是經常出錯的地方。?
?
?
總結
以上是生活随笔為你收集整理的C语言中malloc函数产生的内存泄漏问题的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: cheungssh mysql密码_Ch
- 下一篇: 拦截器原理多个拦截器执行顺序