記憶體溢位和記憶體洩漏是什麼

  在現如今這個電子資訊時代,幾乎每個人都離不開網路、離不開電子產品,而記憶體在電子產品裡有至關重要的作用,幾乎所有的程式都是需要記憶體來處理的,當我們使用電子產品時,所進行的程式太多或者太大,也就是記憶體太滿,處理不了的時候,電子產品就會出現沒有反應、反應慢,沒法建立新的程序等等好多問題。這些常常是因為我們沒有良好的編碼習慣和規範,就會造成我們常說的記憶體洩露和記憶體溢位。

  記憶體溢位就是你要求分配的記憶體超出了系統能給你的,系統不能滿足需求,於是產生溢位。 為了便於理解我們可以有個形象的比喻就是“作業系統可提供給所有程序的儲存空間正在被某個程序榨乾”,最終結果是程式執行時間越長,佔用儲存空間越來越多,最終用盡全部儲存空間,整個系統崩潰。所以“記憶體洩漏”是從作業系統的角度來看的。這裡的儲存空間並不是指實體記憶體,而是指虛擬記憶體大小,這個虛擬記憶體大小取決於磁碟交換區設定的大小。由程式申請的一塊記憶體,如果沒有任何一個指標指向它,那麼這塊記憶體就洩漏了。

  記憶體洩露指由於疏忽或錯誤造成程式未能釋放已經不再使用的記憶體的情況。記憶體洩漏並非指記憶體在物理上的消失,而是應用程式分配某段記憶體後,由於設計錯誤,失去了對該段記憶體的控制,因而造成了記憶體的浪費。 為了便於理解,我們不妨打個比方。緩衝區溢位好比是將十磅的糖放進一個只能裝五磅的容器裡。一旦該容器放滿了,餘下的部分就溢位在櫃檯和地板上,弄得一團糟。由於計算機程式的編寫者寫了一些編碼,但是這些編碼沒有對目的區域或緩衝區——五磅的容器——做適當的檢查,看它們是否夠大,能否完全裝入新的內容——十磅的糖,結果可能造成緩衝區溢位的產生。如果打算被放進新地方的資料不適合,溢得到處都是,該資料也會製造很多麻煩。但是,如果緩衝區僅僅溢位,這只是一個問題。到此時為止,它還沒有破壞性。當糖溢位時,櫃檯被蓋住。可以把糖擦掉或用吸塵器吸走,還櫃檯本來面貌。與之相對的是,當緩衝區溢位時,過剩的資訊覆蓋的是計算機記憶體中以前的內容。除非這些被覆蓋的內容被儲存或能夠恢復,否則就會永遠丟失。發生記憶體洩漏的程式很多,但是要想產生一定的後果,就需要這個程序是無限迴圈的,是個服務程序。當然,核心也是無限迴圈的,所以,如果核心發生了記憶體洩漏,情況就更加不妙。 記憶體洩露的問題其困難在於1.編譯器不能發現這些問題。2.執行時才能捕獲到這些錯誤,這些錯誤沒有明顯的症狀,時隱時現。3.對於手機等終端開發使用者來說,尤為困難。 記憶體洩露的解決方法:第一,良好的編碼習慣,儘量在涉及記憶體的程式段,檢測出記憶體洩露。當程式穩定之後,在來檢測記憶體洩露時,無疑增加了排除的困難和複雜度。第二,過載 new 和 delete。這也是大家編碼過程中常常使用的方法。

  記憶體溢位的解決方法:關掉軟體、或者重啟電腦,釋放一部分記憶體。

  有了以上這麼多的瞭解,小編相信大家在以後使用電子產品時會少很多疏忽和錯誤,而且,在碰到這些常見的問題時也會有基本的解決方法。不過,相比較其他產品,電子產品比較專業化,而且,隨著是時代的進步,更新、淘汰的比較快,還是需要定期請專業人士幫我們檢查、更新,釋放記憶體,這樣,對我們以後的使用會減少很多不必要的麻煩,也會延長這些電子產品的壽命。