• 
    

    
    

      99热精品在线国产_美女午夜性视频免费_国产精品国产高清国产av_av欧美777_自拍偷自拍亚洲精品老妇_亚洲熟女精品中文字幕_www日本黄色视频网_国产精品野战在线观看 ?

      C語言中的內(nèi)存泄漏原因及對(duì)策分析

      2015-05-30 10:48:04李建輝
      中國新通信 2015年5期
      關(guān)鍵詞:指針字節(jié)內(nèi)存

      李建輝

      在C語言程序設(shè)計(jì)中,內(nèi)存泄漏幾乎是很難避免的,C程序產(chǎn)生泄漏內(nèi)存,則運(yùn)行速度會(huì)逐漸變慢,并最終停止運(yùn)行;如果產(chǎn)生覆蓋內(nèi)存,程序會(huì)變得非常脆弱,很容易受到惡意用戶的攻擊。內(nèi)存泄漏是一種隱性危害,它們很難被發(fā)現(xiàn),通常不能在相應(yīng)的源代碼中找到錯(cuò)誤,需要仔細(xì)分析與專門的檢測工具才能發(fā)現(xiàn)。

      一、內(nèi)存泄漏的定義

      通常我們所說的內(nèi)存泄漏,是指分配出去的內(nèi)存在使用之后沒有釋放掉,沒有回收,長此以往,會(huì)造成沒有足夠的內(nèi)存可以分配。一般表現(xiàn)為運(yùn)行時(shí)間越長,占用的內(nèi)存越多,最終導(dǎo)致系統(tǒng)奔潰。一般的內(nèi)存泄漏是指堆內(nèi)存的泄漏。堆內(nèi)存是指程序從堆中分配的,大小任意的(內(nèi)存塊的大小可以在程序運(yùn)行期決定),使用完后必須顯式釋放的內(nèi)存。應(yīng)用程序一般使用malloc,realloc,new等函數(shù)從堆中分配到一塊內(nèi)存,使用完后,程序必須負(fù)責(zé)相應(yīng)的調(diào)用free或delete釋放該內(nèi)存塊,否則,這塊內(nèi)存就不能被再次使用,我們就說這塊內(nèi)存泄漏了。

      二、內(nèi)存泄漏原因分析

      2.1 C語言內(nèi)存分配情況

      在C語言中,根據(jù)數(shù)據(jù)在內(nèi)存中存在的時(shí)間(生存周期)不同,將內(nèi)存空間分為三個(gè)區(qū):1)程序區(qū):用于存儲(chǔ)程序的代碼,即程序的二進(jìn)制代碼。2)靜態(tài)存儲(chǔ)區(qū):用于存儲(chǔ)全局變量和靜態(tài)變量,這些變量的空間在程序編譯時(shí)就已經(jīng)分配好了。3)動(dòng)態(tài)存儲(chǔ)區(qū):用于在程序執(zhí)行時(shí)分配的內(nèi)存,又分為:堆區(qū)(heap)和棧區(qū)(stack)。堆區(qū):用于動(dòng)態(tài)內(nèi)存分配,程序運(yùn)行時(shí)由內(nèi)存分配函數(shù)在堆上分配內(nèi)存。在C語言中,只能使用指針才能動(dòng)態(tài)的分配內(nèi)存。棧區(qū):在函數(shù)執(zhí)行時(shí),函數(shù)內(nèi)部的局部變量和函數(shù)參數(shù)的存儲(chǔ)單元的內(nèi)存區(qū)域,函數(shù)運(yùn)行結(jié)束時(shí),這些內(nèi)存區(qū)域會(huì)自動(dòng)釋放。

      2.2 C語言動(dòng)態(tài)內(nèi)存分配

      在C語言中用內(nèi)存分配函數(shù)來實(shí)現(xiàn)內(nèi)存的動(dòng)態(tài)分配,這些函數(shù)有:malloc()和realloc()等函數(shù)。malloc(): 使用這個(gè)函數(shù)時(shí)需要包含頭文件。使用該函數(shù)需要指定要分配的內(nèi)存字節(jié)數(shù)作為參數(shù),例如:

      int *pNumber=(int *) malloc(100)

      這條語句分配了100個(gè)字節(jié)的內(nèi)存,并把這個(gè)內(nèi)存塊的地址賦給pNumber,這個(gè)內(nèi)存塊可以保存最大25個(gè)int值,每個(gè)int占4個(gè)字節(jié)。如果不能分配請(qǐng)求的內(nèi)存,malloc()會(huì)返回一個(gè)null指針。

      2.3 釋放動(dòng)態(tài)分配的內(nèi)存

      堆上分配的內(nèi)存會(huì)在整個(gè)應(yīng)用程序結(jié)束之后,由操作系統(tǒng)負(fù)責(zé)回收,但最好是在使用完這些內(nèi)存后立即釋放。如果不釋放,會(huì)引起內(nèi)存泄漏,極大占用系統(tǒng)資源,可能會(huì)產(chǎn)生各種未知的錯(cuò)誤。所以,必須使用free()函數(shù)釋放內(nèi)存,參數(shù)是內(nèi)存地址(指針),例如:free(pNumber),依上例。

      三、內(nèi)存泄漏避免的方法

      3.1正確使用malloc函數(shù)分配內(nèi)存

      malloc是一個(gè)函數(shù),專門用來從堆上分配內(nèi)存。使用malloc函數(shù)需要幾個(gè)要求:內(nèi)存分配給誰?分配多大內(nèi)存?是否還有足夠內(nèi)存分配? 內(nèi)存將用來存儲(chǔ)什么格式的數(shù)據(jù)?分配好的內(nèi)存在哪里? 如果這5點(diǎn)都確定,那內(nèi)存就能分配。下面看看malloc的原型:(void *)malloc(int size)

      malloc函數(shù)的返回值是一個(gè)void類型的指針,參數(shù)為int類型的數(shù)據(jù),即申請(qǐng)分配的內(nèi)存大小,單位是字節(jié)。內(nèi)存分配成功之后,malloc函數(shù)返回這塊內(nèi)存的首地址,你需要一個(gè)指針來接受這個(gè)地址。也就是說這塊內(nèi)存將來要用來存儲(chǔ)什么類型的數(shù)據(jù),如:

      char *p = (char *)malloc(100)

      在堆內(nèi)存分配了100個(gè)字節(jié)的內(nèi)存,返回這塊內(nèi)存的首地址,把地址強(qiáng)制轉(zhuǎn)換成char *類型后賦給char *類型的指針變量p;同時(shí)告訴我們這塊內(nèi)存將用來存儲(chǔ)char類型的數(shù)據(jù)。你只能通過指針變量p來操作這塊內(nèi)存,這塊內(nèi)存本身沒有名字,對(duì)它的訪問是匿名訪問。但是,不一定每次malloc函數(shù)都能成功分配到內(nèi)存。既然malloc函數(shù)申請(qǐng)內(nèi)存存在不成功的可能,那我們?cè)谑褂弥赶蜻@塊內(nèi)存的指針時(shí),必須用if( NULL != p)語句上來驗(yàn)證內(nèi)存分配確實(shí)成功了。

      3.2 正確使用free函數(shù)釋放內(nèi)存

      既然有分配,那就必須有釋放,不然的話,有限的內(nèi)存就會(huì)用光,而沒有釋放的內(nèi)存卻占用空間,與malloc對(duì)應(yīng)的就是free函數(shù)了。free函數(shù)只有一個(gè)參數(shù),就是所要釋放的內(nèi)存塊的首地址(指針)。按上例,則為:free(p) 。free函數(shù)其實(shí)它就做了一件事:斬?cái)嘀羔樧兞亢瓦@塊內(nèi)存的對(duì)應(yīng)關(guān)系。free函數(shù)就是把這塊內(nèi)存和p之間的關(guān)系斬?cái)?;p本身的值并沒有改變或者消失,即指針變量p本身保存的地址并沒有改變,那塊被釋放的內(nèi)存里面保存的值也沒有改變。這就是free函數(shù)的功能,一個(gè)malloc對(duì)應(yīng)一個(gè)free,是一夫一妻制。在使用free(p)函數(shù)內(nèi)存釋放后,指針變量p本身保存的地址并沒有改變,那我們必須需重新把p的值變?yōu)镹ULL:p = NULL。如果沒有把該指針置NULL,這個(gè)指針就成為了“懸空指針”,這是很危險(xiǎn)的,且也是經(jīng)常出錯(cuò)的地方。

      四、結(jié)論

      從用戶使用程序的角度來看,作為一般的用戶,根本就感覺不到內(nèi)存泄漏的存在,真正有危害的是內(nèi)存泄漏的堆積,這會(huì)最終消耗盡系統(tǒng)所有的內(nèi)存,給應(yīng)用程序帶來極大的不穩(wěn)定性,要避免這個(gè)問題,需要在代碼設(shè)計(jì)上入手,養(yǎng)成良好的編碼習(xí)慣和規(guī)范。

      參 考 文 獻(xiàn)

      [1] C程序設(shè)計(jì) .唐浩強(qiáng) .北京:華大學(xué)出版社. 1991年7月

      [2]呂維梅,劉堅(jiān). C/C++程序安全漏洞的分類與分析[J] . 計(jì)算機(jī)工程與應(yīng)用,2003:39(6):37-40.

      猜你喜歡
      指針字節(jié)內(nèi)存
      No.8 字節(jié)跳動(dòng)將推出獨(dú)立出口電商APP
      “春夏秋冬”的內(nèi)存
      No.10 “字節(jié)跳動(dòng)手機(jī)”要來了?
      偷指針的人
      為什么表的指針都按照順時(shí)針方向轉(zhuǎn)動(dòng)
      簡談MC7字節(jié)碼
      基于改進(jìn)Hough變換和BP網(wǎng)絡(luò)的指針儀表識(shí)別
      電測與儀表(2015年5期)2015-04-09 11:30:42
      ARM Cortex—MO/MO+單片機(jī)的指針變量替換方法
      基于內(nèi)存的地理信息訪問技術(shù)
      人類進(jìn)入“澤它時(shí)代”
      汕尾市| 台南县| 澎湖县| 察隅县| 宁津县| 沛县| 邹城市| 尚志市| 体育| 迁西县| 武胜县| 泉州市| 寻甸| 东源县| 应城市| 龙游县| 莎车县| 阳朔县| 通榆县| 德江县| 沧州市| 老河口市| 精河县| 绥化市| 凤冈县| 沿河| 周宁县| 扶风县| 托克托县| 阳春市| 穆棱市| 丹江口市| 睢宁县| 波密县| 崇义县| 大足县| 尼玛县| 汉中市| 商南县| 健康| 碌曲县|