C以及C 的記憶體管理分析以及比較

2021-10-07 00:16:39 字數 2688 閱讀 5087

首先看下面這個**

int a=1;

void

test()

對於c語言的學習,我們不難看出,a,b在資料段,num,*p,*ptr在棧,p在堆上,ptr在**段。因此,可以做如下總結。

1. 棧又叫堆疊,非靜態區域性變數/函式引數/返回值等等,棧是向下增長的。

2. 記憶體對映段是高效的i/o對映方式,用於裝載乙個共享的動態記憶體庫。使用者可使用系統介面建立共享共 享記憶體,做程序間通訊。

3. 堆用於程式執行時動態記憶體分配,堆是可以上增長的。

4. 資料段–儲存全域性資料和靜態資料。

5. **段–可執行的**/唯讀常量

在c語言中,常用的記憶體管理函式malloc,realloc,calloc

malloc:只進行空間申請,不進行初始化

realloc調整空間大小

1. 直接原地調整大小。

2. 重新開空間: 重新申請空間,內容拷貝,釋放原有空間

calloc:空間申請並且初始化

當然用上述三個函式,都需要用free釋放空間,否則會造成記憶體洩漏

雖然c語言中的記憶體管理方式可以在c++中繼續使用,但是有時候使用起來會感到比較麻煩,因此在c++中,引入新的關鍵字,new和delete

1.用new,delete操作內建型別

void

test()

注意:

1. 用new申請空間時,型別跟在new關鍵字後面,如果申請連續的空間,則在型別名後面+,並且在方括號中填入所需要的個數。

2.釋放單個元素的空間,使用delete操作符,釋放連續的空間,使用 delete

3.基本型別用new申請連續空間,不能初始化

2. new和delete操作自定義型別

先看這段**

class test

~test()

private:

int _data;};

intmain()

通過列印可以看出:

在申請自定義型別的空間時,new會呼叫建構函式,delete會呼叫析構函式,而malloc與free不會。

這裡還有兩個全域性函式:operator new與operator delete函式

void

test5()

注意:

,operator new 實際也是通過malloc來申請空間,如果malloc申請空間 成功就直接返回,否則執行使用者提供的空間不足應對措施,如果使用者提供該措施就繼續申請,否則就拋異 常。operator delete 最終是通過free來釋放空間的

1.基本型別

如果申請的是內建型別的空間,new和malloc,delete和free基本類似,不同的地方是:new/delete申請和 釋放的是單個元素的空間,new和delete申請的是連續空間,而且new在申請空間失敗時會拋異常, malloc會返回null。

2.自定義型別

new的原理

1 呼叫operator new函式申請空間

2.在申請的空間上執行建構函式,完成物件的構造

delete的原理

1.在空間上執行析構函式,完成物件中資源的清理工作

2 呼叫operator delete函式釋放物件的空間

new t[n]的原理

1.呼叫operator ne**w函式,在operator new中實際呼叫operator new函式完成n個物件空間的申請

2.在申請的空間上執行n次建構函式

delete的原理

1.在釋放的物件空間上執行n次析構函式,完成n個物件中資源的清理

2.呼叫operator delete釋放空間,實際在operator delete中呼叫operator delete來釋放空間

malloc/free和new/delete的區

malloc/free和new/delete的共同點是:都是從堆上申請空間,並且需要使用者手動釋放。不同的地方是:

malloc和free是函式,new和delete是操作符

malloc申請的空間不會初始化,new可以初始化

malloc申請空間時,需要手動計算空間大小並傳遞,new只需在其後跟上空間的型別即可

malloc的返回值為void*, 在使用時必須強轉,new不需要,因為new後跟的是空間的型別

malloc申請空間失敗時,返回的是null,因此使用時必須判空,new不需要,但是new需要捕獲異常

. 申請自定義型別物件時,malloc/free只會開闢空間,不會呼叫建構函式與析構函式,而new在申請空間 後會呼叫建構函式完成物件的初始化,delete在釋放空間前會呼叫析構函式完成空間中資源的清理

C 堆疊以及記憶體分配

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

記憶體管理以及分配

前面有型別的 叫定義 前面無型別的 叫使用 alloc 開闢空間,並且把空間清零 init 初始化 為0 一.棧區 凡是 在函式體內 和 方法體內 定義 的變數 都儲存在棧區 包括形參 棧的特點是 先進後出 先定義的變數 先入棧 後定義的變數後入棧 呼叫函式時 函式中的變數會陸續入棧 函式呼叫結束時...

談談C語言中的變數型別以及記憶體管理

1.生命週期 指的是變數值保留的期限。按照生命週期,可將變數分為兩類 靜態變數和動態變數。靜態變數 靜態變數儲存在記憶體中的靜態儲存區,在編譯的時候就分配了儲存空間,在整個程式執行期間,該變數占有固定的記憶體單元,變數的值都始終存在,直到程式結束後,這部分空間才釋放出來。因此,靜態變數的生命週期為整...