C和C 中記憶體分配的細節

2021-06-14 08:55:46 字數 1573 閱讀 3860

精煉易懂,**

bss段: 用來存放程式中未初始化的全域性變數。bss是英文block started by symbol的簡稱。bss段屬於靜態記憶體分配。

資料段:用來存放程式中已初始化的全域性變數。資料段屬於靜態記憶體分配。

**段:用來存放程式執行**。這

堆:堆是用於存放程序執行中被動態分配的記憶體段,它的大小並不固定,可動態擴張或縮減。當程序呼叫malloc/free等函式分配記憶體時,新分配的記憶體就被動態新增到堆上(堆被擴張)/釋放的記憶體從堆中被剔除(堆被縮減)

棧:棧又稱堆疊, 存放程式的區域性變數(但不包括static宣告的變數,static意味著在資料段中存放變數)。除此以外,在函式被呼叫時,棧用來傳遞引數和返回值。由於棧的先進先出特點,所以棧特別方便用來儲存/恢復呼叫現場。

a) 棧:記憶體由編譯器在需要時自動分配和釋放。通常用來儲存區域性變數和函式引數。

b) 堆:記憶體使用new進行分配使用delete或delete釋放。如果未能對記憶體進行正確的釋放,會造成記憶體洩漏。但在程式結束時,會由作業系統自動**。

c) 自由儲存區:使用malloc進行分配,使用free進行**。和堆類似。

d) 全域性/靜態儲存區:全域性變數和靜態變數被分配到同一塊記憶體中,c語言中區分初始化和未初始化的,c++中不再區分了。

e) 常量儲存區:儲存常量,不允許被修改。

a) 管理方式:棧由編譯器管理,堆由程式設計師控制。

b) 空間大小:vc下棧預設是1mb,堆在32位的系統上可以達到4gb。

c) 碎片問題:棧不會產生碎片,堆會產生碎片。

d) 生長方向:堆向這記憶體位址增加的方向增長,棧向著記憶體位址減少的方向增長。

e) 分配方式:堆是動態分配的。棧是靜態分配和動態分配的,靜態分配由編譯器完成,動態分配由alloca函式進行分配,由編譯器釋放。

f) 分配效率:棧的分配效率非常高。堆的分配機制很複雜,效率比棧要低得多。

不知道

a) auto_ptr: c++03標準,方便管理單個堆物件的記憶體,不能配合容器使用,賦值操作會轉移指標所有權,release()會交出指標所有權。

b) unique_ptr: c++11標準,方便管理堆物件或者堆物件陣列的記憶體,一旦初始化,不會再交出指標所有權,可以避免很多錯誤的實踐。

c) shared_ptr:c++11標準,方便管理需要共享所有權的記憶體,可以配合容器使用,可以用在引數傳遞的過程。

d) weak_ptr:c++11標準,weak_ptr是shared_ptr的觀察者,負責從shared_ptr產生乙個weak_ptr但是不會增加引用計數,當shread_ptr失效以後,weak_ptr也會失效。

e) 如何選擇:不要使用auto_ptr,不要使用裸指標,區域性變數使用unique_ptr需要傳遞和共享的指標使用shared_ptr。

C和C 中的記憶體分配

最近在課堂上聽到老師講了c語言中的記憶體分配,感覺挺深刻的,於是就寫下來,當做是對自己的提醒!微機原理的知識告訴我們,記憶體大致可以分為三部分 區 堆疊區 資料段 我的計算機學的不好,按照自己的理解 c和c 中有全域性變數,靜態變數以及區域性變數等幾類。全域性變數和靜態變數是在編譯的時候就已經分配好...

c和c 中的記憶體分配和記憶體釋放函式

c語言中的free 對應malloc 或delete 對應c 中的new 來釋放 例 char pt1,pt2 pt1 char malloc 100 pt2 pt1 free pt1 pt1 null return 0 第一行定義兩個字元指標,但沒有賦初值,編譯器只給pt1 pt2個分配兩個位元組...

C語言細節 動態記憶體分配

記憶體開闢函式 記憶體釋放函式 關於記憶體塊的補充 malloc.h void malloc size t size 開闢 size 個位元組的連續記憶體空間,未進行初始化 前提 記憶體池有滿足需求的記憶體大小 void calloc size t num,size t size 開闢 num 個 ...