静态内存、动态内存与堆栈
生活随笔
收集整理的這篇文章主要介紹了
静态内存、动态内存与堆栈
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
一、何謂靜態(tài)內(nèi)存、動態(tài)內(nèi)存
- 靜態(tài)內(nèi)存分配好后,程序運行過程中一直存在不會被釋放,且一旦分配好,其內(nèi)存大小就固定下來不能改變,在編譯和鏈接的階段就會分配好。
- 動態(tài)內(nèi)存是程序運行過程中,根據(jù)程序的需要分配和釋放,其大小可變。
二、堆與棧
堆和棧都是動態(tài)分配的,區(qū)別有兩點:
- 1、棧是由編譯器分配與釋放,堆是程序通過調(diào)用malloc或new分配,調(diào)用free或delete釋放。
- 2、棧是線性結(jié)構(gòu),堆是鏈表結(jié)構(gòu)。
三、使用場景
- 1、全局變量和static修飾的靜態(tài)變量都存放在靜態(tài)內(nèi)存區(qū)。
- 2、函數(shù)內(nèi)部定義的局部變量,存儲在棧上,函數(shù)退出時,其占用內(nèi)存被收回。
- 3、通過調(diào)用malloc或new得到的內(nèi)存在堆上,不再需要時要顯示的調(diào)用free或delete來釋放,否則會造成內(nèi)存泄漏,雖然有些操作系統(tǒng)會在程序退出后自動回收這部分內(nèi)存,但還是要記住申請內(nèi)存與釋放內(nèi)存成對操作,養(yǎng)成好習(xí)慣。
下面一段代碼列舉靜態(tài)內(nèi)存和動態(tài)內(nèi)存的各種情形:
//main.cpp int a = 0; //全局初始化區(qū) ,靜態(tài)內(nèi)存 char *p1; //全局未初始化區(qū) ,靜態(tài)內(nèi)存 main() { int b; //棧 char s[] = "abc"; //棧 char *p2; // 棧 char *p3 = "123456"; //"123456\0"在常量區(qū),靜態(tài)內(nèi)存,p3在棧上。 static int c =0; //全局(靜態(tài))初始化區(qū) p1 = (char *)malloc(10); p2 = (char *)malloc(20); //分配 得來的10和20字節(jié)的區(qū)域就在堆區(qū)。 strcpy(p1, "123456"); //"123456\0"放在常量區(qū),編譯器可能會將它與p3所指向的"123456"優(yōu)化成一個地方。 }作者: 心飛揚
總結(jié)
以上是生活随笔為你收集整理的静态内存、动态内存与堆栈的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 回调函数(运用)
- 下一篇: LMV358, LMV321, LMV3