內存分配的三種情況解析:靜態、棧區、堆區

2020-12-23 電子發燒友

內存分配的三種情況解析:靜態、棧區、堆區

佚名 發表於 2017-12-15 11:26:02

內存分配分為三種:靜態、棧區、堆區分別解釋

(1)靜態存儲區:主要存放static靜態變量、全局變量、常量。這些數據內存在編譯的時候就已經為他們分配好了內存,生命周期是整個程序從運行到結束。

(2)棧區:存放局部變量。在執行函數的時候(包括main這樣的函數),函數內的局部變量的存儲單元會在棧上創建,函數執行完自動釋放,生命周期是從該函數的開始執行到結束。(例如,delay_ms(){ int a = 1000;//a就是一個局部變量 在棧區建立存儲單元 delay_ms()執行完畢後自動釋放 })

(3)堆區:程式設計師自己申請一塊任意大小的內存—也叫動態內存分配。這塊內存會一直存在知道程式設計師釋放掉。C語言中,用malloc or new動態地申請內存,用free or delete釋放內存。良好習慣:若申請的動態內存不再使用,要及時釋放掉,否則會造成內存洩露。

打開APP閱讀更多精彩內容

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容圖片侵權或者其他問題,請聯繫本站作侵刪。 侵權投訴

相關焦點

  • 一條進程的棧區、堆區、數據區和代碼區在內存中的映射
    l堆區:用於存放動態分配的對象,當你使用malloc和new等進行分配時,所得到的空間就在堆中。動態分配得到的內存區域附帶有分配信息,所以你能夠free和delete它們。本文引用地址:http://www.eepw.com.cn/article/201611/317090.html數據區:全局,靜態和常量是分配在數據區中的,數據區包括bss(未初始化數據區)和初始化數據區。注意:1)堆向高內存地址生長;2)棧向低內存地址生長;3)堆和棧相向而生,堆和棧之間有個臨界點,稱為stkbrk。
  • 走進C語言:堆、棧與堆區、棧區,你知道有什麼區別嗎?
    5個區:棧區、堆區、靜態區、常量區、代碼區。每個區存儲的內容如下: 1、棧區:存放函數的參數值、局部變量等,由編譯器自動分配和釋放,通常在函數執行完後就釋放了,其操作方式類似於數據結構中的棧。棧內存分配運算內置於CPU的指令集,效率很高,但是分配的內存量有限,比如iOS中棧區的大小是2M。
  • Java內存分配和String類型的深度解析
    棧(Stack):又叫堆棧。JVM為每個新創建的線程都分配一個棧。也就是說,對於一個Java程序來說,它的運行就是通過對棧的操作來完成的。棧以幀為單位保存線程的狀態。JVM對棧只進行兩種操作:以幀為單位的壓棧和出棧操作。我們知道,某個線程正在執行的方法稱為此線程的當前方法。我們可能不知道,當前方法使用的幀稱為當前幀。
  • 關於PHP語言在內存中的分配(堆和棧的區別)
    分享關於編程中的數據在內存裡的存儲方式,本文以PHP語言為例來分析計算機中各段存儲區的區別,代碼段、堆空間段、代碼段、初始化靜態常量段。在PHP中共有8種數據類型,其中4中標量類型(字符串、布爾型、整型、浮點型)、2種複合類型(對象、數組)、2種特殊類型(資源、NULL)。
  • 看完這篇,輕鬆區別堆與棧!
    註:首先堆和棧可以分為兩種,一種是數據結構,另一種是和內存的分配有關,這兩種雖然都有棧和堆,但是兩者關係並不大, 1、棧、堆是數據結構裡面的叫法,注意:有時候有人喜歡這樣說 「堆棧」 其實說的就是棧而不是堆。 2、堆區、棧區則是內存模型的叫法。
  • 程式設計師每日一題-jvm裡方法和方法區、棧區的二三事
    JAVA虛擬機運行時數據區的邏輯圖好,對照上圖,逐項解釋A:堆區是JVM 所管理的內存中最大的一塊。線程共享,主要是存放對象實例和數組。堆區是jvm裡面最需要深入研究的一塊區域,這裡面涉及內存分配,區域劃分,對象信息,垃圾回收。可以說如果java程式設計師對堆區不熟悉,那麼一定寫不出好的代碼。本文暫時不深入討論,後續會開專題深入講解。B:棧區,也叫虛擬機棧,顧名思義,它是一個棧,先進後出。它是線程創建時跟著創建,生命周期和線程一致,是線程私有的。
  • WinCE內存管理報告
    l RAM的另一個區域是程序區。這個區域就像PC機的RAM一樣。它存放所運行程序的堆和棧的空間。對象存儲和程序區的界限是可移動的。在低內存的情況下,系統會請求用戶把部分可用的存儲對象空間提供給運行程序使用,以滿足程序運行的RAM需要。u PC機上,ROM用來存儲BIOS,通常是64-128K。
  • 堆棧在C語言中的定義(單片機的中堆棧相當於棧)
    內存分配中的棧和堆 然而我要說的重點並不在這,我要說的堆和棧並不是數據結構的堆和棧,之所以要說數據結構的堆和棧是為了和後面我要說的堆區和棧區區別開來,請大家一定要注意。 下面就說說C語言程序內存分配中的堆和棧,這裡有必要把內存分配也提一下,大家不要嫌我囉嗦,一般情況下程序存放在Rom或Flash中,運行時需要拷到內存中執行,內存會分別存儲不同的信息,如下圖所示:
  • JVM(堆、方法區、棧、這些基礎您知道了嗎)
    堆(Heap-線程共享)主要存儲: New對象、數組、包括JDK1.7從方法區移過來的字符串常量和靜態變量、還有 線程分配緩衝區(TLAB)當前主流的Java虛擬機都是按照可擴展來實現的(通過參數-Xmx和-Xms設定)、如果在Java堆中沒有內存完成實例分配,並Java虛擬機將會拋出OutOfMemoryError
  • JVM筆記四-棧區
    JVM學習筆記之棧區本文主要內容:棧是什麼?棧幀又是什麼?在JVM中,main方法調用say方法後,是怎麼運行的?本文將詳細講解棧。希望大家學了之後,對棧有更深的了解。心法:在JVM中,棧管運行,堆管存儲。
  • 堆和棧的區分
    不管你是學習c語言,還是學習c++,亦或是學習java,你都會遇到內存分配的問題,而對於內存分配,它其實有兩個地方,一個地方叫做堆,一個地方叫做棧,什麼時候將數據存放到堆上面,什麼時候將數據存放到棧上面,它們的區別是什麼,今天我們就來詳細講解一下。
  • 乾貨——聊聊內存那些事(基於單片機系統)
    內存主要分為:代碼區、常量區、靜態區(全局區)、堆區、棧區這幾個區域。,一旦靜態區的內存被分配, 靜態區的內存直到程序全部結束之後才會被釋放 l  堆區:由程式設計師調用malloc()函數來主動申請的,需使用free()函數來釋放內存,若申請了堆區內存,之後忘記釋放內存,很容易造成內存洩漏
  • 棧:如何實現有效括號的判斷?
    為了讓你清晰地看到這個過程對應的函數棧裡出棧、入棧的操作,我畫了一張圖。圖中顯示的是,在執行到 add() 函數時,函數調用棧的情況。    在算法中,經常會使用的一個思想就是遞歸思想。5.概念區分:數據結構堆棧 VS 內存中的堆棧    在學習計算機基礎的時候,我們知道內存中有棧區和堆區。那它與數據結構中的堆棧有什麼區別了,它們是同一個概念嗎?    內存中的堆棧和數據結構堆棧不是一個概念,可以說內存中的堆棧是真實存在的物理區,數據結構中的堆棧是抽象的數據存儲結構。
  • 面試問題類初始化過程與對象分配過程
    第四步解析就是將一些符號引用換成正真要引用的對象,也就是直接引用。第五步初始化就是執行我們編寫在類中隨著類走的代碼,比如靜態變量設置對應的值,靜態代碼塊的執行。首先要說明幾個JVM運行時內存概念,首先是每個線程都有一個Java虛擬機棧,每個方法對應棧中的一個棧幀。在堆中會為每個線程分配一小段私有的的分配緩衝區 (Thread Local Allocation Buffer,以下簡稱TLAB)。
  • JVM-概述和內存區域
    方法區和堆區是所有線程共享的內存區域;Java棧又叫做jvm虛擬機棧。執行引擎等同於翻譯class文件的語言翻譯器。方法區(永久代)在jdk8中又叫做元空間Metaspace運行時數據區概述堆內存:保存所有引用數據的真實信息;棧內存:基本類型、運算、指向堆內存的指針;方法區:所以定義的方法的信息都保存方法區中,屬於共享區
  • 獨家|Linux進程內存用量分析之堆內存篇
    ),其中每一個分配區都是malloc_state的一個實例,而malloc_par則是參數管理,為靜態成員,全局有唯一的malloc_par實例。下邊從Main arena開始就是所有的分配區信息。Main arena:主分配區信息。主分配區從heap段分配空間,調用brk/sbrk增長,地址連續,所以只有一個堆塊。Dynamic arena:非主分配區信息。
  • Android 內存洩漏探討
    Java 內存分配策略Java 程序運行時的內存分配策略有三種,分別是靜態分配,棧式分配,和堆式分配,對應的,三種存儲策略使用的內存空間主要分別是靜態存儲區(也稱方法區)、棧區和堆區。靜態存儲區(方法區):主要存放靜態數據、全局 static 數據和常量。這塊內存在程序編譯時就已經分配好,並且在程序整個運行期間都存在。
  • Rust語言入門教程 棧和堆
    一旦你掌握了基礎,學習了更多分配器是如何實現的,虛擬內存和其他高級主題之後,將會揭示出這個特定抽象的漏洞。內存管理這兩個術語是關於內存管理的。棧和堆是幫助你決定何時分配和釋放內存的抽象(概念)。這是一個高層次的比較:棧非常快速,並且是 Rust 默認分配內存的地方。不過這個分配位於函數調用的本地,並有大小限制。堆,相反,更慢,並且需要被你的程序顯式分配。
  • java中棧(stack)堆(heap)靜態區(static area)概念
    (class的目的是得到操作指令);jvm只有一個堆區(heap)被所有線程共享,堆中不存放基本類型和對象引用,只存放對象本身;一般由程式設計師分配釋放, 若程式設計師不釋放,程序結束時可能由OS回收。棧(stack):對象實例在heap 中分配好以後,需要在stack中保存一個4位元組的heap內存地址,用來定位該對象實例在heap 中的位置,便於找到該對象實例。
  • C語言內存相關知識
    動態內存分配這裡說一下為什麼要使用動態內存分配,C語言中一切操作都是基於內存的,變量和數組都是內存的別名,如何分配這些內存由編譯器在編譯期間決定,所以定義數組的時候必須指定數組長度,兒數組長度是再編譯器就必須決定了,但是,程序運行過程中,可能需要使用一些額外空間。