日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

内存分区模型

發布時間:2025/4/16 编程问答 12 豆豆
生活随笔 收集整理的這篇文章主要介紹了 内存分区模型 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

C++程序在執行時,將內存大方向劃分為4個區域

  • 代碼區:存放函數體的二進制代碼,由操作系統進行管理的

  • 全局區:存放全局變量靜態變量以及常量

  • 棧區:由編譯器自動分配釋放, 存放函數的參數值,局部變量

  • 堆區:由程序員分配和釋放,若程序員不釋放,程序結束時由操作系統回收


內存四區意義:

不同區域存放的數據,賦予不同的生命周期, 給我們更大的靈活編程


程序運行前

在程序編譯后,生成了exe可執行程序,未執行該程序前分為兩個區域

? 代碼區:

? 存放 CPU 執行的機器指令

? 代碼區是共享的,共享的目的是對于頻繁被執行的程序,只需要在內存中有一份代碼即可

? 代碼區是只讀的,使其只讀的原因是防止程序意外地修改了它的指令

? 全局區:

? 全局變量和靜態變量存放在此.

? 全局區還包含了常量區, 字符串常量和其他常量也存放在此.

? ==該區域的數據在程序結束后由操作系統釋放==.

//全局變量 int g_a = 10; int g_b = 10;//全局常量 const int c_g_a = 10; const int c_g_b = 10;int main() {//局部變量int a = 10;int b = 10;//打印地址cout << "局部變量a地址為: " << (int)&a << endl;cout << "局部變量b地址為: " << (int)&b << endl;cout << "全局變量g_a地址為: " << (int)&g_a << endl;cout << "全局變量g_b地址為: " << (int)&g_b << endl;//靜態變量static int s_a = 10;static int s_b = 10;cout << "靜態變量s_a地址為: " << (int)&s_a << endl;cout << "靜態變量s_b地址為: " << (int)&s_b << endl;cout << "字符串常量地址為: " << (int)&"hello world" << endl;cout << "字符串常量地址為: " << (int)&"hello world1" << endl;cout << "全局常量c_g_a地址為: " << (int)&c_g_a << endl;cout << "全局常量c_g_b地址為: " << (int)&c_g_b << endl;const int c_l_a = 10;const int c_l_b = 10;cout << "局部常量c_l_a地址為: " << (int)&c_l_a << endl;cout << "局部常量c_l_b地址為: " << (int)&c_l_b << endl;system("pause");return 0; }


總結:

  • C++中在程序運行前分為全局區和代碼區

  • 代碼區特點是共享和只讀

  • 全局區中存放全局變量、靜態變量、常量

  • 常量區中存放 const修飾全局常量 和 字符串常量

程序運行后

棧區:

? 由編譯器自動分配釋放, 存放函數的參數值,局部變量

? 注意事項:不要返回局部變量的地址棧區開辟的數據由編譯器自動釋放

int * func() {int a = 10;return &a; }int main() {int *p = func();cout << *p << endl;cout << *p << endl;system("pause");return 0; }

?


堆區:

? 由程序員分配釋放,若程序員不釋放,程序結束時由操作系統回收

? 在C++中主要利用new在堆區開辟內存

#include <iostream> using namespace std; int* func() {int* a = new int(10);return a; }int main() {int *p = func();cout << *p << endl;cout << *p << endl;system("pause");return 0; }

總結:

堆區數據由程序員管理開辟和釋放

堆區數據利用new關鍵字進行開辟內存


new操作符

C++中利用==new==操作符在堆區開辟數據

? 堆區開辟的數據,由程序員手動開辟,手動釋放,釋放利用操作符 ==delete==

? 語法:new 數據類型

? 利用new創建的數據,會返回該數據對應的類型的指針

#include <iostream> using namespace std; int* func() {int* a = new int(10);return a; }int main() {int *p = func();cout << *p << endl;cout << *p << endl;//利用delete釋放堆區數據delete p;//cout << *p << endl; //報錯,釋放的空間不可訪問system("pause");return 0; }

開辟數組

#include <iostream> using namespace std; //堆區開辟數組 int main() {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[] arr;system("pause");return 0; }

?

總結

以上是生活随笔為你收集整理的内存分区模型的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。