静态内存、动态内存与堆栈
生活随笔
收集整理的這篇文章主要介紹了
静态内存、动态内存与堆栈
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
一、何謂靜態內存、動態內存
- 靜態內存分配好后,程序運行過程中一直存在不會被釋放,且一旦分配好,其內存大小就固定下來不能改變,在編譯和鏈接的階段就會分配好。
- 動態內存是程序運行過程中,根據程序的需要分配和釋放,其大小可變。
二、堆與棧
堆和棧都是動態分配的,區別有兩點:
- 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"優化成一個地方。 }作者: 心飛揚
總結
以上是生活随笔為你收集整理的静态内存、动态内存与堆栈的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 回调函数(运用)
- 下一篇: LMV358, LMV321, LMV3