六月丁香五月婷婷,丁香五月婷婷网,欧美激情网站,日本护士xxxx,禁止18岁天天操夜夜操,18岁禁止1000免费,国产福利无码一区色费

學(xué)習(xí)啦 > 知識大全 > 原因大全 > c內(nèi)存泄露的原因

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

時(shí)間: 曾揚(yáng)892 分享

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

  內(nèi)存泄漏是一種很難定位和跟蹤的錯(cuò)誤,那么內(nèi)存泄露的原因是什么呢?下面是學(xué)習(xí)啦小編精心為你整理的c內(nèi)存泄露的原因,一起來看看。

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

  簡單的說就是申請了一塊內(nèi)存空間,使用完畢后沒有釋放掉。它的一般表現(xiàn)方式是程序運(yùn)行時(shí)間越長,占用內(nèi)存越多,最終用盡全部內(nèi)存,整個(gè)系統(tǒng)崩潰。由程序申請的一塊內(nèi)存,且沒有任何一個(gè)指針指向它,那么這塊內(nèi)存就泄露了。

  (1). 常發(fā)性內(nèi)存泄漏。

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

  (2). 偶發(fā)性內(nèi)存泄漏。

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

  (3). 一次性內(nèi)存泄漏。

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

  (4). 隱式內(nèi)存泄漏。

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

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

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

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

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

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

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

  一般我們常說的內(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)存泄漏了。

  c內(nèi)存泄露的檢測工具

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

  2.Dmalloc-Debug Malloc Library.

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

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

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

  6.MEMWATCH-由Johan Lindh編寫,是一個(gè)開放源代碼C語言內(nèi)存錯(cuò)誤檢測工具,主要是通過gcc的precessor來進(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-幫助開發(fā)人員查明C/C++、托管.NET、Java和VB6代碼中的性能和可靠性錯(cuò)誤。PurifyPlus 將內(nèi)存錯(cuò)誤和泄漏檢測、應(yīng)用程序性能描述、代碼覆蓋分析等功能組合在一個(gè)單一、完整的工具包中。

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

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

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

  13.Compuware DevPartner Java Edition-包含Java內(nèi)存檢測,代碼覆蓋率測試,代碼性能測試,線程死鎖,分布式應(yīng)用等幾大功能模塊。

  14.Quest JProbe-分析Java的內(nèi)存泄漏。

  15.ej-technologies JProfiler-一個(gè)全功能的Java剖析工具,專用于分析J2SE和J2EE應(yīng)用程序。它把CPU、執(zhí)行緒和內(nèi)存的剖析組合在一個(gè)強(qiáng)大的應(yīng)用中。

  16.BEAJRockit-用來診斷Java內(nèi)存泄漏并指出根本原因,專門針對Intel平臺并得到優(yōu)化,能在Intel硬件上獲得最高的性能。

c內(nèi)存泄露的原因相關(guān)文章:

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

2.c語言中free的用法

3.亞信科技面試題及參考答案

4.c中free的用法

5.病毒和木馬的區(qū)別

6.c語言中函數(shù)malloc的用法

3026409