內(nèi)存分配方式有三種
-
從靜態(tài)存儲區(qū)域分配
內(nèi)存在程序編譯的時(shí)候就已經(jīng)分配好,這塊內(nèi)存在程序的整個(gè)運(yùn)行期間都存在芒炼。例如全局變量瘫怜, static 變量。 -
在棧上創(chuàng)建
在執(zhí)行函數(shù)時(shí)本刽,函數(shù)內(nèi)局部變量的存儲單元都可以在棧上創(chuàng)建鲸湃,函數(shù)執(zhí)行結(jié)束時(shí)這些存儲單元自動被釋放。棧內(nèi)存分配運(yùn)算內(nèi)置于處理器的指令集中 子寓,效率很高暗挑,但是分配的內(nèi)存容量有限。 -
從堆上分配
亦稱動態(tài)內(nèi)存分配 斜友。程序在運(yùn)行的時(shí)候用 malloc 或 new 申請任意多少的內(nèi)存炸裆,程序員自己負(fù)責(zé)在何時(shí)用 free 或 delete 釋放內(nèi)存。動態(tài)內(nèi)存的生存期由程序員決定 鲜屏,使用非常靈活烹看,但如果在堆上分配了空間,就有責(zé)任回收它洛史,否則運(yùn)行的程序會出現(xiàn)內(nèi)存泄漏惯殊,頻繁地分配和釋放不同大小的堆空間將會產(chǎn)生堆內(nèi)碎塊。
程序的內(nèi)存空間
一個(gè)程序?qū)⒉僮飨到y(tǒng)分配給其運(yùn)行的內(nèi)存塊分為 4 個(gè)區(qū)域也殖,如下圖所示靠胜。
- 代碼區(qū) (code area) 程序內(nèi)存空間
- 全局?jǐn)?shù)據(jù)區(qū) (data area)
- 堆區(qū) (heap area)
- 棧區(qū) (stack area)
一個(gè)例子
一個(gè)由 C/C++ 編譯的程序占用的內(nèi)存分為以下幾個(gè)部分 ,
- 棧區(qū)( stack )由編譯器自動分配釋放 ,存放為運(yùn)行函數(shù)而分配的局部變量、函數(shù)參數(shù)浪漠、返回?cái)?shù)據(jù)、返回地址等霎褐。其操作方式類似于數(shù)據(jù)結(jié)構(gòu)中的棧址愿。
- 堆區(qū)( heap ) 一般由程序員分配釋放, 若程序員不釋放冻璃,程序結(jié)束時(shí)可能由 OS 回收 响谓。分配方式類似于鏈表。
- 全局區(qū)(靜態(tài)區(qū))( static )存放全局變量省艳、靜態(tài)數(shù)據(jù)娘纷、常量。程序結(jié)束后有系統(tǒng)釋放
- 文字常量區(qū) 常量字符串就是放在這里的跋炕。 程序結(jié)束后由系統(tǒng)釋放赖晶。
- 程序代碼區(qū)存放函數(shù)體(類成員函數(shù)和全局函數(shù))的二進(jìn)制代碼。
看下代碼:
int a = 0; // 全局初始化區(qū)
char *p1; // 全局未初始化區(qū)
int main() {
int b; // 棧
char s[] = /"abc/"; // 棧
char *p2; // 棧
char *p3 = /"123456/"; //123456//0 在常量區(qū)辐烂, p3 在棧上遏插。
static int c =0;// 全局(靜態(tài))初始化區(qū)
p1 = new char[10];
p2 = new char[20];
// 分配得來得和字節(jié)的區(qū)域就在堆區(qū)。
strcpy(p1, /"123456/"); //123456//0 放在常量區(qū)纠修,編譯器可能會將它與 p3 所指向的 /"123456/" 優(yōu)化成一個(gè)地方胳嘲。
}