11. 什麼是記憶體溢位和記憶體洩露?
記憶體溢位 out of memory,是指程式在申請記憶體時,沒有足夠的記憶體空間供其使用,出現out of memory;比如申請了乙個integer,但給它存了long才能存下的數,那就是記憶體溢位。
記憶體洩露 memory leak,是指程式在申請記憶體new/malloc後,無法釋放delete/free已申請的記憶體空間,一次記憶體洩露危害可以忽略,但記憶體洩露堆積後果很嚴重,無論多少記憶體,遲早會被占光。memory leak會最終會導致out of memory!
12. 導致記憶體洩漏原因?
(1) 程式迴圈new建立出來的物件沒有及時的delete掉,導致了記憶體的洩露;
(2) delete掉乙個void*型別的指標,導致沒有呼叫到物件的析構函式,析構的所有清理工作都沒有去執行從而導致記憶體的洩露;
(3) new建立了一組物件陣列,記憶體**的時候卻只呼叫了delete而非delete 來處理,導致只有物件陣列的第乙個物件的析構函式得到執行並**了記憶體占用,陣列的其他物件所佔記憶體得不到**,導致記憶體洩露;
13. 導致記憶體溢位原因?
(1) 記憶體分配未成功,卻使用了它。
(2) 記憶體分配儘管成功,可是尚未初始化就引用它。
(3) 記憶體分配成功而且已經初始化,但操作越過了記憶體的邊界。
(4) 使用free 或delete 釋放了記憶體後,沒有將指標設定為null。導致產生「野指標」。
(5) 程式中的物件呼叫關係過於複雜,實在難以搞清楚某個物件到底是否已經釋放了記憶體,此時應該又一次設計資料結構,從根本上解決物件管理的混亂局面
(6) 忘記為陣列和動態記憶體賦初值,導致未被初始化的記憶體被作為右值使用。
14. 記憶體溢位和記憶體洩露解決方法?
記憶體溢位:
(1) 避免上面所說的導致記憶體溢位原因
(2) 在使用記憶體之前檢查指標是否為null。假設指標p 是函式的引數,那麼在函式的入口處用assert(p!=null)進行檢查。假設是用malloc 或new 來申請記憶體,應該用if(p==null)或if(p!=null)進行防錯處理。
記憶體洩露:
(1) 良好的編碼習慣,盡量在涉及記憶體的程式段,檢測出記憶體洩露。
(2) 過載 new 和 delete。將分配的記憶體以鍊錶的形式自行管理,使用完成之後從鍊錶中刪除,程式結束時可檢查改鍊錶,當中記錄了記憶體洩露的檔案
(3) 使用智慧型指標。
(4) 一些常見的工具軟體boundschecker,它主要定位程式執行時期發生的各種錯誤。
(5) 除錯執行debug版程式,運用以下技術:crt(c run-time libraries)、執行時函式呼叫堆疊、記憶體洩漏時提示的記憶體分配序號(整合開發環境output視窗),綜合分析記憶體洩漏的原因,排除記憶體洩漏。
參考:
記憶體洩露和記憶體溢位
一 記憶體洩露 1.定義 指由於疏忽或錯誤造成程式未能釋放已經不再使用的記憶體的情況。記憶體洩漏並非指內存在物理上的消失,而是應用程式分配某段記憶體後,由於設計錯誤,失去了對該段記憶體的控制,因而造成了記憶體的浪費。2.洩露型別 1 堆記憶體洩漏 heap leak a.指利用malloc或new進...
記憶體洩露和記憶體溢位
size medium color red 記憶體洩漏是指分配出去的記憶體無法 了 color 記憶體洩漏指由於疏忽或錯誤造成程式未能釋放已經不再使用的記憶體的情況,是應用程式分配某段記憶體後,由於設計錯誤,失去了對該段記憶體的控制,因而造成了記憶體的浪費。color red 記憶體溢位是指程式要求...
記憶體溢位和記憶體洩露
記憶體溢位是指應用程式系統中存在無法 的記憶體或使用的記憶體過多,最終使得程式執行要使用到的最大記憶體大於虛擬機器能提供的最大記憶體。看到知乎上的例子 你在畫本上畫畫,本子畫完了,畫到桌子上,就是記憶體溢位 是指程式中己動態分配的堆記憶體由於某種原因程式未釋放或無法釋放,造成系統記憶體的浪費,導致程...