C語言內存泄漏原因及對策分析_第1頁
C語言內存泄漏原因及對策分析_第2頁
C語言內存泄漏原因及對策分析_第3頁
C語言內存泄漏原因及對策分析_第4頁
C語言內存泄漏原因及對策分析_第5頁
已閱讀5頁,還剩2頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

------------------------------------------------------------------------C語言內存泄漏原因及對策分析C語言中的內存泄漏原因及對策分析引言:在C語言程序設計中,內存泄漏幾乎是很難避免的,C程序產生泄漏內存,則運行速度會逐漸變慢,并最終停止運行;如果產生覆蓋內存,程序會變得非常脆弱,很容易受到惡意用戶的攻擊。內存泄漏是一種隱性危害,它們很難被發(fā)現(xiàn),通常不能在相應的源代碼中找到錯誤,需要仔細分析與專門的檢測工具才能發(fā)現(xiàn)。1、內存泄漏的定義通常我們所說的內存泄漏,是指分配出去的內存在使用之后沒有釋放掉,沒有回收,長此以往,會造成沒有足夠的內存可以分配。一般表現(xiàn)為運行時間越長,占用的內存越多,最終導致系統(tǒng)奔潰。一般的內存泄漏是指堆內存的泄漏。堆內存是指程序從堆中分配的,大小任意的(內存塊的大小可以在程序運行期決定),使用完后必須顯式釋放的內存。應用程序一般使用malloc,realloc,new等函數(shù)從堆中分配到一塊內存,使用完后,程序必須負責相應的調用free或delete釋放該內存塊,否則,這塊內存就不能被再次使用,我們就說這塊內存泄漏了。2、內存泄漏原因分析內存泄漏的原因實質是沒有釋放向系統(tǒng)申請的內存,要了解內存泄漏產生的原因,我們首先了解C語言內存分配情況。2.1C語言內存分配情況在C語言中,根據(jù)數(shù)據(jù)在內存中存在的時間(生存周期)不同,將內存空間分為三個區(qū):1)程序區(qū):用于存儲程序的代碼,即程序的二進制代碼。2)靜態(tài)存儲區(qū):用于存儲全局變量和靜態(tài)變量,這些變量的空間在程序編譯時就已經分配好了。3)動態(tài)存儲區(qū):用于在程序執(zhí)行時分配的內存,又分為:堆區(qū)(heap)和棧區(qū)(stack)。堆區(qū):用于動態(tài)內存分配,程序運行時由內存分配函數(shù)在堆上分配內存。在C語言中,只能使用指針才能動態(tài)的分配內存。棧區(qū):在函數(shù)執(zhí)行時,函數(shù)內部的局部變量和函數(shù)參數(shù)的存儲單元的內存區(qū)域,函數(shù)運行結束時,這些內存區(qū)域會自動釋放。2.2C語言動態(tài)內存分配在C語言中用內存分配函數(shù)來實現(xiàn)內存的動態(tài)分配,這些函數(shù)有:malloc()和realloc()等函數(shù)。malloc():使用這個函數(shù)時需要包含頭文件<stdlib.h>。使用該函數(shù)需要指定要分配的內存字節(jié)數(shù)作為參數(shù),例如:int*pNumber=(int*)malloc(100)這條語句分配了100個字節(jié)的內存,并把這個內存塊的地址賦給pNumber,這個內存塊可以保存最大25個int值,每個int占4個字節(jié)。如果不能分配請求的內存,malloc()會返回一個null指針。2.3釋放動態(tài)分配的內存堆上分配的內存會在整個應用程序結束之后,由操作系統(tǒng)負責回收,但最好是在使用完這些內存后立即釋放。如果不釋放,會引起內存泄漏,極大占用系統(tǒng)資源,可能會產生各種未知的錯誤。所以,必須使用free()函數(shù)釋放內存,參數(shù)是內存地址(指針),例如:free(pNumber),依上例。3、內存泄漏避免的方法3.1正確使用malloc函數(shù)分配內存malloc是一個函數(shù),專門用來從堆上分配內存。使用malloc函數(shù)需要幾個要求:內存分配給誰?分配多大內存?是否還有足夠內存分配?內存將用來存儲什么格式的數(shù)據(jù)?分配好的內存在哪里?如果這5點都確定,那內存就能分配。下面看看malloc的原型:(void*)malloc(intsize)

malloc函數(shù)的返回值是一個void類型的指針,參數(shù)為int類型的數(shù)據(jù),即申請分配的內存大小,單位是字節(jié)。內存分配成功之后,malloc函數(shù)返回這塊內存的首地址,你需要一個指針來接受這個地址。但是由于函數(shù)的返回值是void*類型,所以必須強制轉換成你所接收的類型。也就是說這塊內存將來要用來存儲什么類型的數(shù)據(jù),如:char*p=(char*)malloc(100)在堆內存分配了100個字節(jié)的內存,返回這塊內存的首地址,把地址強制轉換成char*類型后賦給char*類型的指針變量p;同時告訴我們這塊內存將用來存儲char類型的數(shù)據(jù)。你只能通過指針變量p來操作這塊內存,這塊內存本身沒有名字,對它的訪問是匿名訪問。但是,不一定每次malloc函數(shù)都能成功分配到內存,注意這點:如果所申請的內存塊大于目前堆上剩余的內存塊(整塊),則內存分配就會失敗,返回NULL。因為malloc函數(shù)申請的是連續(xù)的一塊內存。既然malloc函數(shù)申請內存存在不成功的可能,那我們在使用指向這塊內存的指針時,必須用if(NULL!=p)語句上來驗證內存分配確實成功了。3.2正確使用free函數(shù)釋放內存既然有分配,那就必須有釋放,不然的話,有限的內存就會用光,而沒有釋放的內存卻占用空間,與malloc對應的就是free函數(shù)了。free函數(shù)只有一個參數(shù),就是所要釋放的內存塊的首地址(指針)。按上例,則為:free(p)

free函數(shù)其實它就做了一件事:斬斷指針變量和這塊內存的對應關系。比如上面的例子,我們可以說malloc函數(shù)分配的內存塊是屬于p的,因為我們對這塊內存的訪問都需要通過p來進行。free函數(shù)就是把這塊內存和p之間的關系斬斷;p本身的值并沒有改變或者消失,即指針變量p本身保存的地址并沒有改變,那塊被釋放的內存里面保存的值也沒有改變。

這就是free函數(shù)的功能,一個malloc對應一個free,是一夫一妻制。在使用free(p)函數(shù)內存釋放后,指針變量p本身保存的地址并沒有改變,那我們必須需重新把p的值變?yōu)镹ULL:p=NULL。如果沒有把該指針置NULL,這個指針就成為了“懸空指針”,這是很危險的,而且也是經常出錯的地方。4、結論從用戶使用程序的角度來看,作為一般的用戶,根本就感覺不到內存泄漏的存在,真正有危害的是內存泄漏的堆積,這會最終消耗盡系統(tǒng)所有的內存,給應用程序帶來極大的不穩(wěn)定性,要

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論