C++——堆、棧與內存管理


簡介

Stack,是存在於某作用域(scope) 的一塊內存空間(memory space)。例如當你調用函數,函數本身即會形成一個stack 用來放置它所接收的參數,以及返回地址。在函數本體(function body) 內聲明的任何變量,其所使用的內存塊都取自上述stack。
Heap,也叫做system heap,是指由操作系統提供的一塊global 內存空間,程序可動態分配(dynamic allocated) 從某中獲得若干區塊(blocks)。

stack objects 的生命期

c1 便是所謂stack object,其生命在作用域(scope) 結束之際結束。這種作用域內的object,又稱為auto object,因為它會被「自動」清理。

static local objects 的生命期

c2 便是所謂static object,其生命在作用域(scope)結束之后仍然存在,直到整個程序結束。

global objects 的生命期

c3 便是所謂global object,其生命在整個程序結束之后才結束。你也可以把它視為一種static object,其作用域是「整個程序」。

heap objects 的生命期

new:先分配memory, 再調用ctor

delete:先調用dtor, 再釋放memory

 

VC下內存分配

array new 一定要搭配array delete

delete會被拆分成2個動作,其中第二個動作會把下圖那一塊刪掉。刪掉這一塊依據的是cookie,21h表明了內存大小。delete[] p; 和 delete p;都不影響這塊內存的刪除。這一塊內存並沒有發生泄漏。

寫成delete[] p; 這樣,編譯器才知道這是數組,他才會知道下面不只有1個,而是3個,進而調用3次dtor。每個對象死亡之前,調用dtor,把各自分配ed內存釋放掉。

寫成delete p; 這樣,編譯器會認為下面只有1個,因此只會調用一次析構函數。結果紅框部分內存泄漏

如果使用復數的例子,根本沒有指針,也不涉及動態分配。使用array new,而么有array delete也OK。因為他沒要紅框中的東西

但是我們不因該因此而掉以輕心,array new與array delete搭配是個好的編程習慣。

 

 

 

 

 








 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM