c++ 內存管理方式
參考自:
[1] https://www.cnblogs.com/xuelisheng/p/9278800.html
[2] https://www.cnblogs.com/findumars/p/5929831.html?utm_source=itdadao&utm_medium=referral
[2] 對於 c++ 中內存的管理討論得很深入。
1. 靜態儲存區,儲存全局變量,常量。程序編譯時即分配好,程序運行結束時自動釋放。
2. 棧區,非常有限的一塊內存區域,儲存局域變量,函數調用結束之後自動釋放。因為“棧內存分配運算內置於處理器的指令集中”,所以(按我理解)這塊內存的分配和計算都很快。
但是棧區很小,可以用下面的代碼測試得到。(參考自:[3] https://blog.csdn.net/boyixuanbo/article/details/52864954)
#include<iostream> using namespace std; long int count = 0; void stack(){ char msg[1024]; cout<<"count="<<++count<<endl; stack(); } int main(void){ stack(); return0; }
輸出為:
count=1
...
count=7939
Segmentation fault (core dumped)
最終是棧溢出。stack() 每運行一次就申請 1024 byte,所以總共申請了 7939 k,即不到 8 M 以後,棧就爆了。說明棧區大小不到 8 M。
棧內存從高地址向低地址生長。
3. 堆區
new 或者 new [] 開辟的動態內存,都在堆區,堆區幾乎可以窮盡電腦所有內存。開辟的動態內存需要程序員用代碼 delete 或者 delete [] 進行刪除,否則在程序結束之前一直占用,程序結束之後系統自動回收。另外,new [] 申請到的內存不一定連續,因為可能堆區有些內存塊被占用。
“頻繁 new 和 delete 勢必會導致堆內存空間不連續,造成大量碎片,使程序效率降低”(unchecked)。
“但當你必須要使用new 和delete時,你不得不控制C++中的內存分配。你需要用一個全局的new 和delete來代替系統的內存分配符,並且一個類一個類的重載new 和delete。
一個防止堆破碎的通用方法是從不同固定大小的內存持中分配不同類型的對象。對每個類重載new 和delete就提供了這樣的控制。”
[2] 中有重載 new 和 delete 的代碼。
堆內存從低地址向高地址生長
為什麽有malloc/free 還需要 new/delete?因為 malloc/free 不能自動為 對象(非內部數據)申請動態內存,而 new/delete 可以自動調用 對象的構析函數進行申請和釋放。
4. 自由儲存區(我從來沒有涉及過)
malloc() 開辟出來的內存,需要 free() 來終止生命,與堆區相似。
5. 常量儲存區
不可改變的常量儲存在這裏,不允許修改。
c++ 內存管理方式