記憶體分配方式 (轉)
轉貼人:石麟 大連海事大學研究生
實習單位
聯絡方式:to:forest@assuredigit.com">forest@assuredigit.com
分配方式
記憶體分配方式有三種:
(1) 從靜態區域分配。記憶體在編譯的時候就已經分配好,這塊記憶體在程式的整個執行期間都存在。例如全域性變數,static變數。
(2) 在棧上建立。在時,函式內區域性變數的儲存單元都可以在棧上建立,函式執行結束時這些儲存單元自動被釋放。棧記憶體分配運算內建於的指令集中,很高,但是分配的記憶體容量有限。
(3) 從堆上分配,亦稱動態記憶體分配。程式在執行的時候用malloc或new申請任意多少的記憶體,程式設計師自己負責在何時用free或delete釋放記憶體。動態記憶體的生存期由我們決定,使用非常靈活,但問題也最多。
常見的記憶體錯誤及其對策
發生記憶體錯誤是件非常麻煩的事情。不能自動發現這些錯誤,通常是在程式執行時才能捕捉到。而這些錯誤大多沒有明顯的症狀,時隱時現,增加了改錯的難度。有時怒氣衝衝地把你找來,程式卻沒有發生任何問題,你一走,錯誤又發作了。
常見的記憶體錯誤及其對策如下:
u 記憶體分配未成功,卻使用了它。:namespace prefix = o ns = "urn:schemas--com::office" />
新手常犯這種錯誤,因為他們沒有意識到記憶體分配會不成功。常用解決辦法是,在使用記憶體之前檢查指標是否為NULL。如果指標p是函式的引數,那麼在函式的入口處用assert(p!=NULL)進行檢查。如果是用malloc或new來申請記憶體,應該用if(p==NULL) 或if(p!=NULL)進行防錯處理。
u 記憶體分配雖然成功,但是尚未初始化就引用它。
犯這種錯誤主要有兩個起因:一是沒有初始化的觀念;二是誤以為記憶體的預設初值全為零,導致引用初值錯誤(例如陣列)。
記憶體的預設初值究竟是什麼並沒有統一的標準,儘管有些時候為零值,我們寧可信其無不可信其有。所以無論用何種方式建立陣列,都別忘了賦初值,即便是賦零值也不可省略,不要嫌麻煩。
u 記憶體分配成功並且已經初始化,但操作越過了記憶體的邊界。
例如在使用陣列時經常發生下標“多1”或者“少1”的操作。特別是在for迴圈語句中,迴圈次數很容易搞錯,導致陣列操作越界。
u 忘記了釋放記憶體,造成記憶體洩露。
含有這種錯誤的函式每被一次就丟失一塊記憶體。剛開始時的記憶體充足,你看不到錯誤。終有一次程式突然死掉,系統出現提示:記憶體耗盡。
動態記憶體的申請與釋放必須配對,程式中malloc與free的使用次數一定要相同,否則肯定有錯誤(new/delete同理)。
u 釋放了記憶體卻繼續使用它。
有三種情況:
(1)程式中的呼叫關係過於複雜,實在難以搞清楚某個物件究竟是否已經釋放了記憶體,此時應該重新設計資料結構,從根本上解決物件管理的混亂局面。
(2)函式的return語句寫錯了,注意不要返回指向“棧記憶體”的“指標”或者“引用”,因為該記憶體在函式體結束時被自動銷燬。
(3)使用free或delete釋放了記憶體後,沒有將指標設定為NULL。導致產生“野指標”。
l 【規則-1】用malloc或new申請記憶體之後,應該立即檢查指標值是否為NULL。防止使用指標值為NULL的記憶體。
l 【規則-2】不要忘記為陣列和動態記憶體賦初值。防止將未被初始化的記憶體作為右值使用。
l 【規則-3】避免陣列或指標的下標越界,特別要當心發生“多1”或者“少1”操作。
l 【規則-4】動態記憶體的申請與釋放必須配對,防止記憶體洩漏。
l 【規則-5】用free或delete釋放了記憶體之後,立即將指標設定為NULL,防止產生“野指標”。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10752019/viewspace-984618/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 垃圾收集器與記憶體分配策略_記憶體分配策略記憶體
- 動態記憶體分配記憶體
- 作業系統——記憶體連續分配管理方式作業系統記憶體
- java-方法記憶體分配Java記憶體
- go記憶體分配器Go記憶體
- 深度理解glibc記憶體分配記憶體
- java基礎-記憶體分配Java記憶體
- hadoop 記憶體分配規則Hadoop記憶體
- C語言-記憶體分配C語言記憶體
- 記憶體分配策略學習記憶體
- 記憶體的分配與釋放,記憶體洩漏記憶體
- linux記憶體管理(一)實體記憶體的組織和記憶體分配Linux記憶體
- C中的記憶體分配模型記憶體模型
- C++動態記憶體分配C++記憶體
- 記憶體分配問題處理記憶體
- mimalloc記憶體分配程式碼分析記憶體
- C語言的記憶體分配C語言記憶體
- [20210126]探究oracle記憶體分配.txtOracle記憶體
- 【Java】 記憶體分配全面淺析Java記憶體
- JVM GC 與 記憶體分配策略JVMGC記憶體
- Python如何管理記憶體?記憶體分配機制是什麼?Python記憶體
- jvm:記憶體模型、記憶體分配及GC垃圾回收機制JVM記憶體模型GC
- MySQL記憶體管理,記憶體分配器和作業系統MySql記憶體作業系統
- Java記憶體區域與分配策略Java記憶體
- 【記憶體管理】頁面分配機制記憶體
- curl 中減少記憶體分配操作記憶體
- Go記憶體分配和GC的理解Go記憶體GC
- JVM 之 記憶體分配與回收策略JVM記憶體
- 深入理解golang:記憶體分配原理Golang記憶體
- Netty 中的記憶體分配淺析Netty記憶體
- MySQL OOM 系列一 Linux記憶體分配MySqlOOMLinux記憶體
- JVM垃圾回收和記憶體分配策略JVM記憶體
- 圖解Go語言記憶體分配圖解Go記憶體
- Android O 8.0 以上 bitmap記憶體分配Android記憶體
- v8記憶體分配淺談記憶體
- STM32記憶體結構介紹和FreeRTOS記憶體分配技巧記憶體
- C++ 指標動態記憶體分配C++指標記憶體
- 垃圾收集器與記憶體分配策略記憶體
- MySQL 配置InnoDB的記憶體分配器MySql記憶體