C 記憶體分布及用法

2022-09-21 08:36:10 字數 2060 閱讀 3108

目錄

通過下面一張圖看看c++的記憶體分布:

棧區:由編譯器自動分配與釋放,存放為程式執行時函式分配的區域性變數、函式引數;棧記憶體分配運算內置於處理器的指令集中,效率很高,但是分配記憶體的容量有限;qlvqewccfw

堆區:由new、malloc分配的記憶體塊,釋放由應用程式控制,不需要編譯器釋放;如果程式設計師沒有對該記憶體進行釋放,程式結束後系統自動**,堆的地方比棧大很多;

靜態區:存放的是static的靜態變數和一些全域性變數,特點是唯讀、大小固定;靜態變數和全域性變數的儲存期是一起的,一旦靜態區的記憶體被分配,要一直等到程式全部結束後才釋放;

1、分配方式不同:棧區系統分配系統**;堆區由程式設計師手動申請,需要求程式設計師自行**,如果沒有**,系統在程式結束後會進行**,這種情況會造成記憶體洩漏;

2、生命週期不同:棧區生命週期是系統分配到系統**,也就是在大括號內;堆區是從申請到釋放;

3、效率不同:主要原因是位址空間是否連續,棧區位址空間是連續的,效率會高一些;堆區位址空間不連續,需要遍歷鍊錶才能找到最近的位址,效率會低一些;

4、記憶體碎片:堆區容易產生記憶體碎片,棧區不會;

5、生長方向不同:棧區申請空間的位址(表示位址的八個十六進製制數)是從大到小的,堆區申請空間位址是從小到大的。棧區是先進後出的原則,模擬棧結構的特點;

注意點:申請的空間是在堆區,變數本身是在棧區!

可操作的記憶體qlvqewccfw分配:

不可操作的記憶體分配:

核心區、**區、區域性變數的分配也屬於系統分配;

c++中通常使用qlvqewccfwnew、delete來構造和銷毀物件;

使用new建立物件,返回的是物件的首位址,需要用指標接收:

int *y = new int(2);

std::cout << *y << std::endl;

物件的構建和銷毀分為兩步:分配記憶體、所分配記憶體上構造物件(銷毀與之類似);

new的幾種常見形式:

根據分配的是單一物件還是陣列,採用相應的方式銷毀;

i *y = new int[3];

delete y;

不能delete乙個非new返回的記憶體(也就是棧記憶體);

delete nullptr是可被允許的;

同一塊記憶體不能delete多次;

new不需要指定分配多大,malloc使用的時候必須指定大小;new的底層實現就是malloc,兩者都必須釋放記憶體,不否則容易造成野指標或記憶體洩漏。需要注意一點,釋放記憶體後需設定相關指標為空指標;

總結:是指由於疏忽或錯誤造成程式未能釋放掉不再使用的記憶體的情況,記憶體洩漏並非指內存在物理上的小時,而是應用程式分配某段記憶體後,由於設計錯誤,失去該段記憶體的控制從而造成記憶體浪費;

可能的原因:

計算機重要部件之一,是外存與cpu進行溝通的橋梁。計算機所有程式都是在記憶體執行的,因此記憶體的效能對計算機的影響非常大。記憶體也稱為記憶體儲器和主儲存器,作用是暫時存放cpu的運算資料,以及與硬碟等外部儲存器交換的資料;

定址空間:儲存記憶體位址的多少,通常我們說的4g記憶體,就表示計算機能儲存2的32次方個位址,也就是能找到這些位址上的二進位制資訊;

定址能力:每個位址裡能存多少個bit,現在的計算機大多數是16位機器了;

使得系統執行實際的記憶體空間比想象的大得多,虛擬記憶體是可以遠大於物理記憶體的,同時主要為了使程式執行的時候可以不限制於只訪問記憶體大小,可以通過虛擬記憶體位址去訪問磁碟空間;

每乙個程序虛擬記憶體都是獨立的,獨立的享有計算機的記憶體。虛擬記憶體位址的大小是與位址匯流排位數相關,物理記憶體位址的大小是與物理記憶體條的容量與磁碟容量相關。

void fun()

b是在棧區的變數,由於b是乙個區域性變數,隨著函式域 的結束被釋放,不需要程式設計師自行釋放,儘管b使用new進行初始化,還是可以認為分配在棧區;

總結:本次系統的從記憶體的基礎概念到記憶體分配進行了講解,記憶體是我們開發中最重要的一部分,往往邏輯上的錯誤就會造成記憶體洩漏,導致程式無法執行。或者一些分配記憶體的方式不夠細心,也會造成冗餘記憶體的使用。在目前的很多嵌入式板子上,針對記憶體的介面是必備的,往往也都是基於malloc修改;

還有一點需要注意,不管任何機器上執行程式,操作的都是虛擬記憶體,內部通過頁表定位到對應的物理記憶體。關於硬體方面的本質,如果做嵌入式端的話需要深入研究。

C記憶體分布

先看一下測試 include include int g val int g ival 5 char g ptr char g iptr hongchunhua static int s val static int s ival 5 int print add int val int main 輸...

C 記憶體分布

在c 中,記憶體分成5個區,他們分別是堆 棧 自由儲存區 全域性 靜態儲存區和常量儲存區。棧,就是那些由編譯器在需要的時候分配,在不需要的時候自動清楚的變數的儲存區。裡面的變數通常是區域性變數 函式引數等。堆,就是那些由new分配的記憶體塊,他們的釋放編譯器不去管,由我們的應用程式去控制,一般乙個n...

C 記憶體分布

預備知識 程式的記憶體分配 乙個由c c 編譯的程式占用的記憶體分為以下幾個部分 1 棧區 stack 由編譯器自動分配釋放 存放函式的引數值,區域性變數的值等。其操作方式類似於資料結構中的棧。2 堆區 heap 一般由程式設計師分配釋放,若程式設計師不釋放,程式結束時可能由os 注意它與資料結構中...