靜態內存、動態內存與堆棧


一、何謂靜態內存、動態內存

 

靜態內存分配好后,程序運行過程中一直存在不會被釋放,且一旦分配好,其內存大小就固定下來不能改變,在編譯和鏈接的階段就會分配好。

動態內存是程序運行過程中,根據程序的需要分配和釋放,其大小可變。

 

二、堆與棧

 

堆和棧都是動態分配的,區別有兩點:

1、棧是由編譯器分配與釋放,堆是程序通過調用malloc或new分配,調用free或delete釋放。

2、棧是線性結構,堆是鏈表結構。

 

三、使用場景

 

1、全局變量和static修飾的靜態變量都存放在靜態內存區。

2、函數內部定義的局部變量,存儲在棧上,函數退出時,其占用內存被收回。

3、通過調用malloc或new得到的內存在堆上,不再需要時要顯示的調用free或delete來釋放,否則會造成內存泄漏,雖然有些操作系統會在程序退出后自動回收這部分內存,但還是要記住申請內存與釋放內存成對操作,養成好習慣。

 

下面一段代碼列舉靜態內存和動態內存的各種情形:

//main.cpp 
int a = 0;  //全局初始化區 ,靜態內存
char *p1;  //全局未初始化區 ,靜態內存
main() 

int b;  //棧 
char s[] = "abc";  //棧 
char *p2; // 棧 
char *p3 = "123456";  //"123456\0"在常量區,靜態內存,p3在棧上。 
static int c =0; //全局(靜態)初始化區 
p1 = (char *)malloc(10); 
p2 = (char *)malloc(20); 
//分配 得來的10和20字節的區域就在堆區。 
strcpy(p1, "123456");  //"123456\0"放在常量區,編譯器可能會將它與p3所指向的"123456"優化成一個地方。 


免責聲明!

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



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