C++記憶體分割槽模型
阿新 • • 發佈:2020-08-03
記憶體分割槽模型
分割槽名 | 儲存內容 |
程式碼區 | 存放函式體的二進位制程式碼,由作業系統進行管理 |
全域性區 | 全域性變數,靜態變數,常量,在程式執行結束後由作業系統管理 |
棧區 | 由編譯器自動分配,釋放,存放函式的引數值,區域性變數 |
堆區 | 由程式設計師分配釋放,程式執行結束,由作業系統回收 |
在程式未執行前就生成的區域
1程式碼區
作用:存放cpu機器指令
特點:
1共享的,頻繁執行的程式需要在記憶體中存在一份
2只讀的,防止程式的指令被意外的修改
2全域性區
作用:存放全域性變數和靜態變數(static修飾的區域性變數),還包括了常量區,常量區分為字串常量和其他常量(const修飾的全域性變數)
3棧區
作用:存放函式的引數值和區域性變數(普通區域性變數和const修飾的區域性變數)
注意事項:不要返回區域性變數的地址,其記憶體由編譯器自動釋放,訪問該地址的指向的記憶體沒有意義,在釋放記憶體後,第一次訪使用地址訪問記憶體,編譯器保留資料,第二次及以後訪問將不再保留
4堆區
作用:由程式設計師分配和釋放,在程式執行完畢後,由作業系統管理
使用new和delete關鍵字分配和釋放記憶體
#include<iostream> using namespace std; //使用new關鍵字為一個變數分配記憶體 int *func() { //new關鍵字返回的是一個地址//語法 new int(變數的值); int *p = new int(10); return p; } void test01() { int *p = func(); cout << *p << endl; cout << *p << endl; cout << *p << endl; //使用delete關鍵字釋放一個變數的記憶體 delete p; cout << *p << endl; p = nullptr; }void test02() { //使用new關鍵字為陣列分配記憶體 //語法 new int[陣列長度]; int *arr = new int[10]; for (int i = 0; i < 10; ++i) { arr[i] = i + 100; } for (int i = 0; i < 10; ++i) { cout << arr[i] << endl; } //使用delete關鍵字釋放陣列所佔用的記憶體 //語法delete[] 指向陣列首址的指標; delete[] arr; } int main() { // test01(); test02(); system("pause"); return 0; }
分配方式:C++中使用new 關鍵字分配記憶體
4堆區