前言
C++將內存方向劃分爲4個區域,代碼區、全局區、棧區、堆區。每個區存放的數據,都賦予不同的生命週期,給予程序員更大的靈活編程。
解釋四區
- 程序運行前
在程序編譯後,生成了exe可執行程序,在未執行該程序前內存分爲下面兩個區域。
代碼區:
1、存放CPU指行的機器指令(就是我們寫的代碼,只不過被翻譯成立0101);
2、代碼區是共享的,共享的目的是對於頻繁被執行的程序,只需在內存中有一份代碼即可;
3、代碼區是隻讀的,使其只讀的原因是防止程序意外修改了他的指令;
全局區:
1、全局變量和靜態變量存放在此;
2、全局區還包含常量區、字符串常量、const修飾的全局變量;
3、該區域的數據在程序結束後由操作系統釋放;
- 程序運行後
程序運行後,內存又開闢了另外兩個區。
棧區:
1、由編譯器自動分配釋放,存放函數參數、局部變量等。
2、注意:不要返回局部變量的地址,因爲棧區的數據在函數執行完後自動釋放。
堆區:
1、由程序員分配釋放,C++中主要利用new在堆區開闢內存。
2、開闢的內存由指針進行接收,如:*p = new int(666);
3、開闢內存最好手動收回,用delete關鍵字。
代碼區
存放函數體的二進制代碼,由操作系統進行管理。
全局區
存放全局變量、靜態變量、常量。
棧區
存放函數的參數值、局部變量、const修飾的局部變量,由編譯器自動分配釋放。
堆區
由程序員分配和釋放,若程序員不釋放,程序結束時由操作系統回收。
int *p = new int(10);
delete p;
int *q = new int[10];//定義大小爲10的數組
delete[] q;