一、何謂靜態內存、動態內存
靜態內存分配好后,程序運行過程中一直存在不會被釋放,且一旦分配好,其內存大小就固定下來不能改變,在編譯和鏈接的階段就會分配好。
動態內存是程序運行過程中,根據程序的需要分配和釋放,其大小可變。
二、堆與棧
堆和棧都是動態分配的,區別有兩點:
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"優化成一個地方。
}
