1. 程式人生 > 實用技巧 >C++記憶體分割槽模型

C++記憶體分割槽模型

記憶體分割槽模型

分割槽名 儲存內容
程式碼區 存放函式體的二進位制程式碼,由作業系統進行管理
全域性區 全域性變數,靜態變數,常量,在程式執行結束後由作業系統管理
棧區 由編譯器自動分配,釋放,存放函式的引數值,區域性變數
堆區 由程式設計師分配釋放,程式執行結束,由作業系統回收

在程式未執行前就生成的區域

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堆區