首先看下面這個**
對於c語言的學習,我們不難看出,a,b在資料段,num,*p,*ptr在棧,p在堆上,ptr在**段。因此,可以做如下總結。int a=1;
void
test()
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.生命週期 指的是變數值保留的期限。按照生命週期,可將變數分為兩類 靜態變數和動態變數。靜態變數 靜態變數儲存在記憶體中的靜態儲存區,在編譯的時候就分配了儲存空間,在整個程式執行期間,該變數占有固定的記憶體單元,變數的值都始終存在,直到程式結束後,這部分空間才釋放出來。因此,靜態變數的生命週期為整...