999精品在线视频,手机成人午夜在线视频,久久不卡国产精品无码,中日无码在线观看,成人av手机在线观看,日韩精品亚洲一区中文字幕,亚洲av无码人妻,四虎国产在线观看 ?

C語言中的內存泄漏原因及對策分析

2015-05-30 10:48:04李建輝
中國新通信 2015年5期
關鍵詞:分配程序

李建輝

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

一、內存泄漏的定義

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

二、內存泄漏原因分析

2.1 C語言內存分配情況

在C語言中,根據數據在內存中存在的時間(生存周期)不同,將內存空間分為三個區:1)程序區:用于存儲程序的代碼,即程序的二進制代碼。2)靜態存儲區:用于存儲全局變量和靜態變量,這些變量的空間在程序編譯時就已經分配好了。3)動態存儲區:用于在程序執行時分配的內存,又分為:堆區(heap)和棧區(stack)。堆區:用于動態內存分配,程序運行時由內存分配函數在堆上分配內存。在C語言中,只能使用指針才能動態的分配內存。棧區:在函數執行時,函數內部的局部變量和函數參數的存儲單元的內存區域,函數運行結束時,這些內存區域會自動釋放。

2.2 C語言動態內存分配

在C語言中用內存分配函數來實現內存的動態分配,這些函數有:malloc()和realloc()等函數。malloc(): 使用這個函數時需要包含頭文件。使用該函數需要指定要分配的內存字節數作為參數,例如:

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

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

2.3 釋放動態分配的內存

堆上分配的內存會在整個應用程序結束之后,由操作系統負責回收,但最好是在使用完這些內存后立即釋放。如果不釋放,會引起內存泄漏,極大占用系統資源,可能會產生各種未知的錯誤。所以,必須使用free()函數釋放內存,參數是內存地址(指針),例如:free(pNumber),依上例。

三、內存泄漏避免的方法

3.1正確使用malloc函數分配內存

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

malloc函數的返回值是一個void類型的指針,參數為int類型的數據,即申請分配的內存大小,單位是字節。內存分配成功之后,malloc函數返回這塊內存的首地址,你需要一個指針來接受這個地址。也就是說這塊內存將來要用來存儲什么類型的數據,如:

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

在堆內存分配了100個字節的內存,返回這塊內存的首地址,把地址強制轉換成char *類型后賦給char *類型的指針變量p;同時告訴我們這塊內存將用來存儲char類型的數據。你只能通過指針變量p來操作這塊內存,這塊內存本身沒有名字,對它的訪問是匿名訪問。但是,不一定每次malloc函數都能成功分配到內存。既然malloc函數申請內存存在不成功的可能,那我們在使用指向這塊內存的指針時,必須用if( NULL != p)語句上來驗證內存分配確實成功了。

3.2 正確使用free函數釋放內存

既然有分配,那就必須有釋放,不然的話,有限的內存就會用光,而沒有釋放的內存卻占用空間,與malloc對應的就是free函數了。free函數只有一個參數,就是所要釋放的內存塊的首地址(指針)。按上例,則為:free(p) 。free函數其實它就做了一件事:斬斷指針變量和這塊內存的對應關系。free函數就是把這塊內存和p之間的關系斬斷;p本身的值并沒有改變或者消失,即指針變量p本身保存的地址并沒有改變,那塊被釋放的內存里面保存的值也沒有改變。這就是free函數的功能,一個malloc對應一個free,是一夫一妻制。在使用free(p)函數內存釋放后,指針變量p本身保存的地址并沒有改變,那我們必須需重新把p的值變為NULL:p = NULL。如果沒有把該指針置NULL,這個指針就成為了“懸空指針”,這是很危險的,且也是經常出錯的地方。

四、結論

從用戶使用程序的角度來看,作為一般的用戶,根本就感覺不到內存泄漏的存在,真正有危害的是內存泄漏的堆積,這會最終消耗盡系統所有的內存,給應用程序帶來極大的不穩定性,要避免這個問題,需要在代碼設計上入手,養成良好的編碼習慣和規范。

參 考 文 獻

[1] C程序設計 .唐浩強 .北京:華大學出版社. 1991年7月

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

猜你喜歡
分配程序
基于可行方向法的水下機器人推力分配
應答器THR和TFFR分配及SIL等級探討
遺產的分配
試論我國未決羈押程序的立法完善
人大建設(2019年12期)2019-05-21 02:55:44
一種分配十分不均的財富
績效考核分配的實踐與思考
失能的信仰——走向衰亡的民事訴訟程序
“程序猿”的生活什么樣
英國與歐盟正式啟動“離婚”程序程序
環球時報(2017-03-30)2017-03-30 06:44:45
創衛暗訪程序有待改進
中國衛生(2015年3期)2015-11-19 02:53:32
主站蜘蛛池模板: 亚洲无线观看| 日本高清有码人妻| 欧美 国产 人人视频| 国产91丝袜在线播放动漫 | 国产精品丝袜在线| 国产sm重味一区二区三区| 欧美成a人片在线观看| 欧美一区二区丝袜高跟鞋| 欧美精品在线免费| 日韩中文字幕免费在线观看| 亚洲国产成人无码AV在线影院L| AV无码一区二区三区四区| 国产拍在线| 亚亚洲乱码一二三四区| 国产精品99久久久久久董美香| 国产亚洲精品在天天在线麻豆| 亚洲av无码人妻| 四虎成人精品| 无码AV动漫| 精品国产香蕉伊思人在线| 91福利在线观看视频| 天天色综网| 免费看的一级毛片| 亚洲中文字幕23页在线| 亚洲国产日韩在线成人蜜芽| 国产午夜福利亚洲第一| 亚洲欧美另类久久久精品播放的| 欧美日韩高清在线| 欧美啪啪网| 成人午夜亚洲影视在线观看| 亚洲第一在线播放| 在线观看国产黄色| 高清不卡毛片| www.亚洲一区| 欧美全免费aaaaaa特黄在线| 国产精品私拍在线爆乳| 五月婷婷综合在线视频| 久热精品免费| 欧美区一区二区三| 韩国自拍偷自拍亚洲精品| 97久久人人超碰国产精品| 久996视频精品免费观看| 日韩AV无码免费一二三区| 黄色网页在线观看| 午夜欧美在线| 99久久精品免费看国产免费软件| 婷婷亚洲综合五月天在线| 国产精品成人观看视频国产| 无码免费的亚洲视频| 成年人福利视频| 在线观看热码亚洲av每日更新| 精品偷拍一区二区| 在线不卡免费视频| 91精品久久久无码中文字幕vr| 国产情侣一区二区三区| 亚洲大尺码专区影院| 国内a级毛片| 国产95在线 | 5388国产亚洲欧美在线观看| 激情国产精品一区| 特级aaaaaaaaa毛片免费视频| 99视频国产精品| 98精品全国免费观看视频| 专干老肥熟女视频网站| 强奷白丝美女在线观看| 欧美一级色视频| 色综合中文综合网| 一级黄色片网| 中日韩一区二区三区中文免费视频 | 亚洲日韩精品伊甸| 欧美一区日韩一区中文字幕页| 51国产偷自视频区视频手机观看| 欧美人在线一区二区三区| 国模在线视频一区二区三区| a级毛片免费在线观看| 亚洲品质国产精品无码| 国产微拍一区| 久久精品波多野结衣| 亚洲第一成年人网站| 91精品专区国产盗摄| 伦伦影院精品一区| 免费人成黄页在线观看国产|