C++ 內存分區模型

目錄

程序運行前

代碼區

全局區

程序運行后

new

在堆區開辟數據?

delete釋放堆區數據

堆區開辟數組

內存分區模型

棧(Stack)

堆(Heap)

全局/靜態存儲區(Global/Static Storage)

常量存儲區(Constant Storage)

代碼區(Code Area)


程序運行前

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

代碼區

存放 CPU 執行的機器指令

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

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

全局區

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

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

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

  • C++中在程序運行前分為全局區和代碼區
  • 代碼區特點是共享和只讀
  • 全局區中存放全局變量、靜態變量、常量
  • 常量區中存放 const修飾的全局常量 ?和 字符串常量
#include <iostream>
using namespace std;//全局變量
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;//靜態變量static int s_a = 10;static int s_b = 10;return 0;
}

程序運行后

不要返回局部變量的地址,棧區開辟的數據由編譯器自動釋放

#include <iostream>
using namespace std;int * func(int a) // 形參也是放在棧區
{int a = 10;return &a; // 不要返回局部變量的地址,棧區開辟的數據由編譯器自動釋放
}int main() {int *p = func();cout << *p << endl; // 10 第一次可以打印這個數字,是因為編譯器做了保留cout << *p << endl; // 隨機值 第二次這個數據就不再保留了return 0;
}

new

利用new關鍵字,可以將數據開辟到堆區

在堆區開辟數據?

int *p = new int(10)

new int(10)表示在堆內存上動態分配了一個int類型的空間,并用值10初始化了該空間。
p指針變量,本質上也是局部變量,放在棧上,指針指向的是所開辟的堆內存區的數據的地址。

int *p = func()

p雖然是在func()函數中聲明的局部變量,但它存儲的是一個指向堆內存的地址。
當函數func()執行完畢后,p雖然在函數棧幀中被銷毀,但指向堆內存的地址仍然存在。

int * func() {/*利用new關鍵字,可以將數據開辟到堆區*/int *p = new int(10); // new當前返回的是int類型的指針,具體什么類型由開辟的數據類型決定return p; // 客觀上返回的是堆區的地址
}int *p = func()/*p雖然是在func()函數中聲明的局部變量,但它存儲的是一個指向堆內存的地址。當函數func()執行完畢后,p雖然在函數棧幀中被銷毀,但指向堆內存的地址仍然存在。
*/
cout << *p << endl; // 10

delete釋放堆區數據

    int * func() {int *p = new int(10); return p; }int *p = func();delete p; // 釋放堆區數據cout << *p << endl; // error 內存已經釋放,再次訪問已經是非法操作,報錯

堆區開辟數組

在堆區開辟數組——創建10個整形數據的數組

  • new int[10]動態分配一個包含10個int類型元素的數組時,內存管理系統會分配一塊連續的內存空間來存儲這個數組。
  • 指針arr存儲的就是這塊內存空間的起始地址,也就是數組的第一個元素的地址。
  • 類似于C語言中的數組名
void test() {/*new int[10]動態分配一個包含10個int類型元素的數組時,內存管理系統會分配一塊連續的內存空間來存儲這個數組。指針arr存儲的就是這塊內存空間的起始地址,也就是數組的第一個元素的地址。類似于C語言中的數組名*/int *arr = new int[10]; // 10代表數組有10個元素,注意這里是中括號,不是小括號for (int i = 0; i < 10; i++){arr[i] = i + 100; // 給這10個元素賦值 1000~109 (arr[i] == *(arr + i))}for (int i = 0; i < 10; i++){cout << arr[i] << endl; // 100 ~ 109}//釋放堆區的數組數據內存。數組需要加 []delete[] arr;
}test();

內存分區模型

C++的內存分區模型描述了程序在運行時如何使用系統內存。了解內存分區模型對于理解程序的內存管理和運行效率非常重要!

在一般情況下,C++程序在內存中的布局可以分為以下幾個主要區域:

棧(Stack)

  1. 棧是用于存儲局部變量、函數參數、函數返回地址以及函數調用時所需的臨時數據的區域。
  2. 棧的大小在程序運行時是可以動態變化的,通常由系統自動管理。
  3. 棧內存的分配和釋放是由系統自動完成的,遵循"先進后出"的原則。

堆(Heap)

  1. 堆被用于存儲動態分配的內存,例如使用newdelete關鍵字來分配和釋放的內存。
  2. 堆的大小也是動態變化的,可以在程序運行時根據需要進行分配和釋放。
  3. 程序員通常需要手動管理堆內存的分配和釋放,因此在使用時需要注意內存泄漏和內存溢出的風險。

全局/靜態存儲區(Global/Static Storage)

  1. 全局變量、靜態變量以及常量通常存儲在這個區域。
  2. 這部分內存在程序啟動時就被分配,并在程序結束時才被釋放,它們的生命周期與整個程序的生命周期相同。

常量存儲區(Constant Storage)

  1. 存放常量數據,如字符串常量等。
  2. 這部分內存通常被固定分配,并且存儲的數據在程序運行期間不會改變。

代碼區(Code Area)

  1. 存放程序的執行代碼,通常是只讀的。
  2. 程序的機器指令和函數體都存儲在這個區域。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/208727.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/208727.shtml
英文地址,請注明出處:http://en.pswp.cn/news/208727.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

力扣230. 二叉搜索樹中第K小的元素

深度優先搜索 思路&#xff1a; 二叉搜索樹的特性&#xff0c;通過中序遍歷得到有序序列&#xff0c;則遍歷到第K個節點的時候即為結果&#xff1b;使用棧通過深度優先遍歷進行中序遍歷&#xff1a; 先將節點和左子節點壓棧&#xff1b;然后棧頂上就是“最左”葉子節點&#x…

Linux DAC權限的簡單應用

Linux的DAC&#xff08;Discretionary Access Control&#xff09;權限模型是一種常見的訪問控制機制&#xff0c;它用于管理文件和目錄的訪問權限。作為一名經驗豐富的Linux系統安全工程師&#xff0c;我會盡可能以簡單明了的方式向計算機小白介紹Linux DAC權限模型。 在Linu…

jenkins中“Jenkins Plot Plugin”的使用方法,比較兩個excel的數據差異

Jenkins Plot Plugin是Jenkins的一個插件&#xff0c;它可以用于生成圖表和報表&#xff0c;以便更好地理解和分析構建和測試數據。下面是使用Jenkins Plot Plugin比較兩個Excel數據差異的步驟&#xff1a; 1.安裝Jenkins Plot Plugin&#xff1a;在Jenkins的插件管理頁面搜索…

使用 Axios 進行網絡請求的全面指南

使用 Axios 進行網絡請求的全面指南 本文將向您介紹如何使用 Axios 進行網絡請求。通過分步指南和示例代碼&#xff0c;您將學習如何使用 Axios 庫在前端應用程序中發送 GET、POST、PUT 和 DELETE 請求&#xff0c;并處理響應數據和錯誤。 準備工作 在開始之前&#xff0c;請…

電子學會C/C++編程等級考試2021年09月(五級)真題解析

C/C++等級考試(1~8級)全部真題?點這里 第1題:抓牛 農夫知道一頭牛的位置,想要抓住它。農夫和牛都位于數軸上,農夫起始位于點N(0<=N<=100000),牛位于點K(0<=K<=100000)。農夫有兩種移動方式: 1、從X移動到X-1或X+1,每次移動花費一分鐘 2、從X移動到2*X,每…

ubuntu18.04安裝opencv-4.5.5+opencv_contrib-4.5.5

一、安裝opencv依賴 sudo apt-get install build-essential sudo apt-get install cmake git libgtk2.0-dev pkg-config libavcodec-dev libavformat-dev libswscale-dev sudo apt-get install python-dev python-numpy libtbb2 libtbb-dev libjpeg-dev libpng-dev libtiff-d…

Navicat 技術指引 | 適用于 GaussDB 分布式的自動運行功能

Navicat Premium&#xff08;16.3.3 Windows 版或以上&#xff09;正式支持 GaussDB 分布式數據庫。GaussDB 分布式模式更適合對系統可用性和數據處理能力要求較高的場景。Navicat 工具不僅提供可視化數據查看和編輯功能&#xff0c;還提供強大的高階功能&#xff08;如模型、結…

「Python編程基礎」第7章:字符串操作

文章目錄 一、回顧二、新手容易踩坑的引號三、轉義字符四、多行字符串寫法五、注釋六、字符串索引和切片七、字符串的in 和 not in八、字符串拼接九、轉換大小寫十、合并字符串join()十一、分割字符串split()十二、字符串替換 replace()十三、字符串內容判斷方法十四、字符串內…

讀文章摘錄

20%的時間可以做點業余項目。有個叫克萊舍基的人&#xff0c;寫了一本書&#xff0c;書名叫《認知盈余-網絡時代的創造與繁榮》&#xff0c;他有個觀點&#xff0c;閑暇時間給人機會創造有價值的東西。 很重要的一點是選合適的人&#xff0c;把他們引入團隊。何謂合適的人&…

uniapp 開發app項目步驟

Uniapp 是一個基于 Vue.js 的跨平臺開發框架&#xff0c;可以將同一個項目同時編譯到多個平臺&#xff0c;包括 H5、iOS、Android 等。以下是開發 Uniapp 項目的步驟&#xff1a; 安裝 Uniapp 可以通過 npm 安裝 Uniapp&#xff0c;具體操作如下&#xff1a; npm install -g…

Qt使用Cryptopp生成HMAC-MD5

近期項目中HTTPS通訊中&#xff0c;token需要使用HMAC-MD5算法生成&#xff0c;往上找了一些資料后&#xff0c;仍不能滿足自身需求&#xff0c;故次一記。 前期準備&#xff1a; ①下載Cryptopp庫&#xff08;我下載的是8.8.0 Release版本&#xff09;&#xff1a;Crypto Li…

Linux: glibc: net/if.h vs linux/if.h

最近看到一段代碼改動,用net/if.h替換了linux/if.h。仔細看了看這兩個的區別: https://stackoverflow.com/questions/20082433/what-is-the-difference-between-linux-if-h-and-net-if-h 從網上搜了一下看到如下的一個編譯錯誤,如果同時使用這兩個if.h文件,需要將net/if.h…

注意力機制添加方法

要將注意力機制模塊添加到YoloV5工程項目中的yolo.py中&#xff0c;可參考以下四種情況。 以下4個elif代碼來自https://yolov5.blog.csdn.net/article/details/129108082 elif m in [SimAM, ECA, SpatialGroupEnhance,TripletAttention]:args [*args[:]]elif m in [CoordAtt…

【1day】致遠系統A6版本operaFileActionController.jsp接口任意文件讀取漏洞學習

注:該文章來自作者日常學習筆記,請勿利用文章內的相關技術從事非法測試,如因此產生的一切不良后果與作者無關。 目錄 一、漏洞描述 二、影響版本 三、資產測繪 四、漏洞復現

基于ResNet模型的908種超大規模中草藥圖像識別系統

中草藥藥材圖像識別相關的實踐在前文中已有對應的實踐了&#xff0c;感興趣的話可以自行移步閱讀即可&#xff1a; 《python基于輕量級GhostNet模型開發構建23種常見中草藥圖像識別系統》 《基于輕量級MnasNet模型開發構建40種常見中草藥圖像識別系統》 在上一篇文章中&…

RocketMQ-RocketMQ高性能核心原理(流程圖)

1.NamesrvStartup 2.BrokerStartup 3. DefualtMQProducer 4.DefaultMQPushConsumer

maven工程的pom.xml文件中增加了依賴,但偶爾沒有下載到本地倉庫

maven工程pom.xml文件中的個別依賴沒有下載到本地maven倉庫。以前沒有遇到這種情況&#xff0c;今天就遇到了這個問題&#xff0c;把解決過程記錄下來。 我在eclipse中編輯maven工程的pom.xml文件&#xff0c;增加對mybatis的依賴&#xff0c;但保存文件后&#xff0c;依賴的j…

Java--1v1雙向通信-控制臺版

文章目錄 前言客戶端服務器端輸出線程端End 前言 TCP&#xff08;Transmission Control Protocol&#xff09;是一種面向連接的、可靠的網絡傳輸協議&#xff0c;它提供了端到端的數據傳輸和可靠性保證。 本程序就是基于tcp協議編寫而成的。 利用 TCP 協議進行通信的兩個應用…

HarmonyOS(鴻蒙操作系統)與Android系統 各自特點 架構對比 各自優勢

綜合對比 HarmonyOS&#xff08;鴻蒙操作系統&#xff09;是由華為開發的操作系統&#xff0c;旨在跨多種設備和平臺使用。HarmonyOS的架構與谷歌開發的廣泛使用的Android操作系統有顯著不同。以下是兩者之間的一些主要比較點&#xff1a; 設計理念和使用案例&#xff1a; Harm…

go語言 grpc 攔截器

文章目錄 攔截器服務端攔截器一元攔截器流攔截器 客戶端攔截器一元攔截器流攔截 多個攔截器 代碼倉庫 攔截器 gRPC攔截器&#xff08;interceptor&#xff09;是一種函數&#xff0c;它可以在gRPC調用之前和之后執行一些邏輯&#xff0c;例如認證、授權、日志記錄、監控和統計…