記憶體洩露與記憶體分配區間

2021-10-06 02:04:18 字數 1097 閱讀 3679

當動態分配的記憶體不在使用時, 它應給被釋放,這樣以後可以重新使用記憶體。分配記憶體但是在使用完畢之後不進行釋放將會引起記憶體洩露。記憶體洩漏並非指內存在物理上的消失,而是應用程式分配某段記憶體後,由於設計錯誤,導致在釋放該段記憶體之前就失去了對該段記憶體的控制,從而造成了記憶體的浪費。

對於乙個c語言程式而言,記憶體空間主要由五個部分組成:**段(.text)、資料段(.data)、靜態區(.bss)、堆和棧組成。

bss段:bss段(bss segment)通常是指用來存放程式中未初始化的全域性變數和靜態變數的一塊記憶體區域。bss是英文block started by symbol的簡稱。bss段屬於靜態記憶體分配。 bss節不包含任何資料,只是簡單的維護開始和結束的位址,即總大小,以便記憶體區能在執行時分配並被有效地清零。bss節在應用程式的二進位制映象檔案中並不存在,即不占用磁碟空間 而只在執行的時候占用記憶體空間 ,所以如果全域性變數和靜態變數未初始化那麼其可執行檔案要小很多。

資料段:資料段(data segment)通常是指用來存放程式中已初始化的全域性變數和靜態變數的一塊記憶體區域。資料段屬於靜態記憶體分配,可以分為唯讀資料段和讀寫資料段。 字串常量等,但一般都是放在唯讀資料段中 。

**段:**段(code segment/text segment)通常是指用來存放程式執行**的一塊記憶體區域。這部分區域的大小在程式執行前就已經確定,並且記憶體區域通常屬於唯讀, 某些架構也允許**段為可寫,即允許修改程式。在**段中,也有可能包含一些唯讀的常數變數,例如字串常量等,但一般都是放在唯讀資料段中 。

棧區:由系統自動分配,棧區的分配運算內置於處理器的指令集,當函式執行結束時由系統自動釋放。存放區域性變數。棧的缺點是:容量有限,當相應的區間被釋放時,區域性變數不可再使用。查詢棧容量的命令:ulimits -s。棧是一塊連續的區域,向高位址擴充套件,棧頂和容量是事先約定好的。

堆區:在程式的執行過程中才能分配,由程式設計師決定,編譯器在編譯時無法為他們分配空間,只有在程式執行時分配,所以被稱為動態分配。堆是不連續的區域,向高位址擴充套件。由於系統用鍊錶來描述空閒的位址空間,鍊錶的遍歷是由地位址向高位址的,故堆區是不連續的動態的儲存空間。

記憶體溢位與記憶體洩露

2019獨角獸企業重金招聘python工程師標準 兩者的區別 記憶體溢位 out of memory 指程式在申請記憶體時,沒有足夠的記憶體空間供其使用,出現out of memory 比如申請了乙個integer,但給它存了long才能存下的數,那就是記憶體溢位。記憶體洩露 memory leak...

記憶體溢位,與記憶體洩露

記憶體洩漏 memory leak 是指程式在申請記憶體後,無法釋放已申請的記憶體空間 只出不進漏氣一樣 記憶體溢位 就是你要的記憶體空間超過了系統實際分配的空間,此時系統相當於沒法滿足你的需求,就會報記憶體溢位的錯誤 比方說棧,棧滿時再做進棧必定產生空間溢位,叫上溢,棧空時再做退棧也產生空間溢位,...

java 記憶體溢位與記憶體洩露

記憶體溢位 out of memory 是指程式在申請記憶體時,沒有足夠的記憶體空間供其使用,出現out of memory 比如申請了乙個integer,但給它存了long才能存下的數,那就是記憶體溢位。記憶體洩露 memory leak 是指程式在申請記憶體後,無法釋放已申請的記憶體空間,一次記...