<em id="0a85b"><option id="0a85b"></option></em>

<abbr id="0a85b"></abbr>

      <nobr id="0a85b"></nobr>
        <tr id="0a85b"></tr>
        9久久伊人精品综合,亚洲一区精品视频在线,成 人免费va视频,国产一区二区三区黄网,99国产精品永久免费视频,亚洲毛片多多影院,精品久久久无码人妻中文字幕,无码国产欧美一区二区三区不卡
        學(xué)習(xí)啦 > 知識(shí)大全 > 原因大全 > 造成內(nèi)存泄露的原因

        造成內(nèi)存泄露的原因

        時(shí)間: 曉賢752 分享

        造成內(nèi)存泄露的原因

          內(nèi)存泄漏一般是指程序中己動(dòng)態(tài)分配的堆內(nèi)存由于某種原因程序未釋放或無(wú)法釋放,造成系統(tǒng)內(nèi)存的浪費(fèi)。下面學(xué)習(xí)啦給大家分析造成內(nèi)存泄露的原因。

          造成內(nèi)存泄露的原因

          嚴(yán)格意義上的內(nèi)存泄露的原因只有一種:沒(méi)有釋放向系統(tǒng)申請(qǐng)的內(nèi)存,因?yàn)椴簧暾?qǐng)內(nèi)存,就談不上什么泄露,搞清楚內(nèi)存泄露的原因,應(yīng)當(dāng)從匯編語(yǔ)言的角度考慮問(wèn)題。 當(dāng)然沒(méi)有釋放內(nèi)存的原因是多種的: 有可能是你自己代碼寫的不好,忘記了釋放自己代碼里申請(qǐng)的內(nèi)存, 也有可能是你使用了一個(gè)寫的不好的庫(kù),庫(kù)本身有問(wèn)題,這里說(shuō)的庫(kù)不僅僅是第三方庫(kù),甚至于各種語(yǔ)言的運(yùn)行時(shí)庫(kù)也有可能出現(xiàn)(再高的人都免不了出BUG),還甚至于操作系統(tǒng)的庫(kù),因?yàn)椴僮飨到y(tǒng)的BUG也多的很(當(dāng)然系統(tǒng)一般情況不會(huì)出現(xiàn)這些低級(jí)的錯(cuò)誤)。 死循環(huán)不能說(shuō)是內(nèi)存泄露,概念上應(yīng)稱為死鎖,死鎖的確是有可能會(huì)導(dǎo)致內(nèi)存無(wú)限量增長(zhǎng),但其與內(nèi)存泄露有本質(zhì)區(qū)別,盡管有時(shí)候它們導(dǎo)致的結(jié)果在內(nèi)存層面是相同的。

          泄漏的分類

          以發(fā)生的方式來(lái)分類,內(nèi)存泄漏可以分為4類:

          (1). 常發(fā)性內(nèi)存泄漏。 發(fā)生內(nèi)存泄漏的代碼會(huì)被多次執(zhí)行到,每次被執(zhí)行的時(shí)候都會(huì)導(dǎo)致一塊內(nèi)存泄漏。

          (2). 偶發(fā)性內(nèi)存泄漏。 發(fā)生內(nèi)存泄漏的代碼只有在某些特定環(huán)境或操作過(guò)程下才會(huì)發(fā)生。常發(fā)性和偶發(fā)性是相對(duì)的。對(duì)于特定的環(huán)境,偶發(fā)性的也許就變成了常發(fā)性的。所以測(cè)試環(huán)境和測(cè)試方法對(duì)檢測(cè)內(nèi)存泄漏至關(guān)重要。

          (3). 一次性內(nèi)存泄漏。 發(fā)生內(nèi)存泄漏的代碼只會(huì)被執(zhí)行一次,或者由于算法上的缺陷,導(dǎo)致總會(huì)有一塊僅且一塊內(nèi)存發(fā)生泄漏。比如,在類的構(gòu)造函數(shù)中分配內(nèi)存,在析構(gòu)函數(shù)中卻沒(méi)有釋放該內(nèi)存,所以內(nèi)存泄漏只會(huì)發(fā)生一次。

          (4). 隱式內(nèi)存泄漏。  程序在運(yùn)行過(guò)程中不停的分配內(nèi)存,但是直到結(jié)束的時(shí)候才釋放內(nèi)存。嚴(yán)格的說(shuō)這里并沒(méi)有發(fā)生內(nèi)存泄漏,因?yàn)樽罱K程序釋放了所有申請(qǐng)的內(nèi)存。但是對(duì)于一個(gè)服務(wù)器程序,需要運(yùn)行幾天,幾周甚至幾個(gè)月,不及時(shí)釋放內(nèi)存也可能導(dǎo)致最終耗盡系統(tǒng)的所有內(nèi)存。所以,我們稱這類內(nèi)存泄漏為隱式內(nèi)存泄漏。

          編輯本段危害  從用戶使用程序的角度來(lái)看,內(nèi)存泄漏本身不會(huì)產(chǎn)生什么危害,作為一般的用戶,根本感覺(jué)不到內(nèi)存泄漏的存在。真正有危害的是內(nèi)存泄漏的堆積,這會(huì)最終消耗盡系統(tǒng)所有的內(nèi)存。從這個(gè)角度來(lái)說(shuō),一次性內(nèi)存泄漏并沒(méi)有什么危害,因?yàn)樗粫?huì)堆積,而隱式內(nèi)存泄漏危害性則非常大,因?yàn)檩^之于常發(fā)性和偶發(fā)性內(nèi)存泄漏它更難被檢測(cè)到。

          內(nèi)存泄漏的表現(xiàn)

          內(nèi)存泄漏或者是說(shuō),資源耗盡后,系統(tǒng)會(huì)表現(xiàn)出什么現(xiàn)象哪?

          cpu資源耗盡:估計(jì)是機(jī)器沒(méi)有反應(yīng)了,鍵盤,鼠標(biāo),以及網(wǎng)絡(luò)等等。這個(gè)在windows上經(jīng)常看見(jiàn),特別是中了毒。

          進(jìn)程id耗盡:沒(méi)法創(chuàng)建新的進(jìn)程了,串口或者telnet都沒(méi)法創(chuàng)建了。

          硬盤耗盡: 機(jī)器要死了,交換內(nèi)存沒(méi)法用,日志也沒(méi)法用了,死是很正常的。

          內(nèi)存泄漏或者內(nèi)存耗盡:新的連接無(wú)法創(chuàng)建,free的內(nèi)存比較少。發(fā)生內(nèi)存泄漏的程序很多,但是要想產(chǎn)生一定的后果,就需要這個(gè)進(jìn)程是無(wú)限循環(huán)的,是個(gè)服務(wù)進(jìn)程。當(dāng)然,內(nèi)核也是無(wú)限循環(huán)的,所以,如果內(nèi)核發(fā)生了內(nèi)存泄漏,情況就更加不妙。內(nèi)存泄漏是一種很難定位和跟蹤的錯(cuò)誤,目前還沒(méi)看到有什么好用的工具(當(dāng)然,用戶空間有一些工具,有靜態(tài)分析的,也會(huì)動(dòng)態(tài)分析的,但是找內(nèi)核的內(nèi)存泄漏,沒(méi)有好的開(kāi)源工具)

          內(nèi)存泄漏和對(duì)象的引用計(jì)數(shù)有很大的關(guān)系,再加上c/c++都沒(méi)有自動(dòng)的垃圾回收機(jī)制,如果沒(méi)有手動(dòng)釋放內(nèi)存,問(wèn)題就會(huì)出現(xiàn)。如果要避免這個(gè)問(wèn)題,還是要從代碼上入手,良好的編碼習(xí)慣和規(guī)范,是避免錯(cuò)誤的不二法門。

          一般我們常說(shuō)的內(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)存就不能被再次使用,我們就說(shuō)這塊內(nèi)存泄漏了。

          內(nèi)存泄露的危害

          從用戶使用程序的角度來(lái)看,內(nèi)存泄漏本身不會(huì)產(chǎn)生什么危害,作為一般的用戶,根本感覺(jué)不到內(nèi)存泄漏的存在。真正有危害的是內(nèi)存泄漏的堆積,這會(huì)最終消耗盡系統(tǒng)所有的內(nèi)存。從這個(gè)角度來(lái)說(shuō),一次性內(nèi)存泄漏并沒(méi)有什么危害,因?yàn)樗粫?huì)堆積,而隱式內(nèi)存泄漏危害性則非常大,因?yàn)檩^之于常發(fā)性和偶發(fā)性內(nèi)存泄漏它更難被檢測(cè)到。

          檢查內(nèi)存的工具

          1.ccmalloc-Linux和Solaris下對(duì)C和C++程序的簡(jiǎn)單的使用內(nèi)存泄漏和malloc調(diào)試庫(kù)。

          2.Dmalloc-Debug Malloc Library.

          3.Electric Fence-Linux分發(fā)版中由Bruce Perens編寫的malloc()調(diào)試庫(kù)。

          4.Leaky-Linux下檢測(cè)內(nèi)存泄漏的程序。

          5.LeakTracer-Linux、Solaris和HP-UX下跟蹤和分析C++程序中的內(nèi)存泄漏。

          6.MEMWATCH-由Johan Lindh編寫,是一個(gè)開(kāi)放源代碼C語(yǔ)言內(nèi)存錯(cuò)誤檢測(cè)工具,主要是通過(guò)gcc的precessor來(lái)進(jìn)行。

          7.Valgrind-Debugging and profiling Linux programs, aiming at programs written in C and C++.

          8.KCachegrind-A visualization tool for the profiling data generated by Cachegrind and Calltree.

          9.IBM Rational PurifyPlus-幫助開(kāi)發(fā)人員查明C/C++、托管.NET、Java和VB6代碼中的性能和可靠性錯(cuò)誤。PurifyPlus 將內(nèi)存錯(cuò)誤和泄漏檢測(cè)、應(yīng)用程序性能描述、代碼覆蓋分析等功能組合在一個(gè)單一、完整的工具包中。

          10.ParasoftInsure++-針對(duì)C/C++應(yīng)用的運(yùn)行時(shí)錯(cuò)誤自動(dòng)檢測(cè)工具,它能夠自動(dòng)監(jiān)測(cè)C/C++程序,發(fā)現(xiàn)其中存在著的內(nèi)存破壞、內(nèi)存泄漏、指針錯(cuò)誤和I/O等錯(cuò)誤。并通過(guò)使用一系列獨(dú)特的技術(shù)(SCI技術(shù)和變異測(cè)試等),徹底的檢查和測(cè)試我們的代碼,精確定位錯(cuò)誤的準(zhǔn)確位置并給出詳細(xì)的診斷信息。能作為MicrosoftVisual C++的一個(gè)插件運(yùn)行。

          11.Compuware DevPartner for Visual C++ BoundsChecker Suite-為C++開(kāi)發(fā)者設(shè)計(jì)的運(yùn)行錯(cuò)誤檢測(cè)和調(diào)試工具軟件。作為Microsoft Visual Studio和C++ 6.0的一個(gè)插件運(yùn)行。

          12.Electric Software GlowCode-包括內(nèi)存泄漏檢查,code profiler,函數(shù)調(diào)用跟蹤等功能。給C++和.Net開(kāi)發(fā)者提供完整的錯(cuò)誤診斷,和運(yùn)行時(shí)性能分析工具包。


        猜你感興趣:

        1.內(nèi)存分配失敗什么原因

        2.內(nèi)存泄漏的原因是什么

        3.c內(nèi)存泄露的原因

        4.造成內(nèi)存泄露的原因

        734475 主站蜘蛛池模板: а√天堂8在线官网| 国产精品人成在线播放蜜臀| 国产精品视频一区不卡| 日本高清中文字幕免费一区二区| 久久国产精品不只是精品| 亚洲一区二区中文av| 亚洲精品成人福利网站| 男人猛躁进女人免费播放| 国产永久免费高清在线观看| 国产一区二区三区黄网| 亚洲狠狠色丁香婷婷综合| 精品无码国产污污污免费| 亚洲av日韩av一区久久| 日韩美女av二区三区四区| 国产老熟女一区二区三区| 国产亚洲AV电影院之毛片| 亚洲高清中文字幕在线看不卡| 国产国语一级毛片在线视频| 99久久国产成人免费网站| 国产精品黑色丝袜在线观看| 亚洲欧美啪啪视屏| 国产精品沙发午睡系列990531| 熟妇人妻久久春色视频网| 欲乱人妻少妇邻居毛片| 国内少妇人妻丰满av| 开心五月婷婷综合网站| 亚洲综合精品一区二区三区| 东京热人妻无码一区二区AV| 综合色区亚洲熟女妇p| 色狠狠色噜噜AV一区| 日本系列亚洲系列精品| 东方av四虎在线观看| 99精品国产一区二区青青| 亚洲国产视频精品一区二区| 自拍第一区视频在线观看| 最新国产精品好看的精品| 亚洲深深色噜噜狠狠网站| 激情综合色综合啪啪五月| 欧美高清一区三区在线专区| 国产亚洲精品久久久久久无亚洲| 欧美精品V欧洲精品|