C++核心編程之內(nèi)存分區(qū)模型詳解
內(nèi)存分區(qū)模型
C++程序在執(zhí)行時(shí),將內(nèi)存大方向分為四個(gè)區(qū)域。
- 代碼區(qū):存放函數(shù)體的二進(jìn)制代碼,由操作系統(tǒng)進(jìn)行管理。
- 全局區(qū):存放全局變量和靜態(tài)變量以及常量。
- 棧區(qū):由編譯器自動(dòng)分配釋放,存放函數(shù)的參數(shù)值,局部變量等
- 堆區(qū):由程序員分配和釋放,若程序員不釋放,程序結(jié)束時(shí)由操作系統(tǒng)回收
內(nèi)存四區(qū)意義:
不同區(qū)域存放的數(shù)據(jù),賦予不同的生命周期,給我們更大的靈活編程。
程序運(yùn)行前
在程序編譯后,生成exe可執(zhí)行程序,未執(zhí)行該程序前分為兩個(gè)區(qū)域。
代碼區(qū):
- 存放CPU執(zhí)行的機(jī)器指令
- 代碼區(qū)時(shí)共享的,共享的目的時(shí)對(duì)于頻繁被執(zhí)行的程序,只需要在內(nèi)存中有一份代碼即可
- 代碼區(qū)是只讀的,使其只讀的原因是防止程序意外地修改了他的指令
全局區(qū):
- 全局變量和靜態(tài)變量存放在此處
- 全局區(qū)還包含了常量區(qū),字符串常量和其他常量也存放在此
- 該區(qū)域的數(shù)據(jù)在程序結(jié)束后由操作系統(tǒng)釋放
程序運(yùn)行后
棧區(qū):
- 由編譯器自動(dòng)分配釋放,存放函數(shù)的參數(shù)值,局部變量等
- 注意事項(xiàng):不要返回局部變量的地址,棧區(qū)開辟的數(shù)據(jù)由編譯器自動(dòng)釋放
#include<iostream> #include<cstdlib> using namespace std; //棧區(qū)數(shù)據(jù)注意事項(xiàng) --- 不要返回局部變量的地址 //棧區(qū)的數(shù)據(jù)由編譯器管理開辟和釋放 int* func(int b) //形參數(shù)據(jù)也會(huì)放在棧區(qū) { b = 100; int a = 10; //局部變量 存放在棧區(qū),棧區(qū)的數(shù)據(jù)在函數(shù)執(zhí)行完后自動(dòng)釋放 return &a; //返回局部變量的地址 } int main() { //接受func函數(shù)的返回值 int * p = func(1); cout << *p << endl; //第一次可以答應(yīng)正確的數(shù)字,是因?yàn)榫幾g器做了保留 cout << *p << endl; //第二次這數(shù)據(jù)就不再保留了(2022版本的vs做出改版,對(duì)返回值保留持續(xù)了) system("pause"); }
編譯器編譯時(shí)會(huì)提示不要返回局部變量或者臨時(shí)變量的地址。一般會(huì)被釋放產(chǎn)生問題(在2022VS中加入了更高的適配,對(duì)其做出了保留,但是不要如此使用)
堆區(qū)
- 由程序員分配釋放,若是程序員不釋放,程序結(jié)束時(shí)由操作做系統(tǒng)回收
- 在C++中主要利用new在堆區(qū)開辟內(nèi)存
示例
#include<iostream> using namespace std; int* func() { //利用new關(guān)鍵字可以將數(shù)據(jù)開辟到堆區(qū) //指針 本質(zhì)也是局部變量,放在棧上 int* p=new int(10); return p; } int main() { //在堆區(qū)開辟數(shù)據(jù) int* p = func(); cout << *p << endl; cout << *p << endl; system("pause"); return 0; }
總結(jié):
- 堆區(qū)數(shù)據(jù)由程序員管理開辟和釋放
- 堆區(qū)數(shù)據(jù)利用new關(guān)鍵字進(jìn)行開辟內(nèi)存
new操作符
- c++中利用new操作符在堆區(qū)開辟數(shù)據(jù)
- 堆區(qū)開辟的數(shù)據(jù),由程序員手動(dòng)開辟,手動(dòng)釋放,釋放利用操作符delete
- 語(yǔ)法 : new 數(shù)據(jù)類型
- 利用new創(chuàng)建的數(shù)據(jù),會(huì)返回該數(shù)據(jù)對(duì)應(yīng)的類型的指針
- 示例:
#include<iostream> using namespace std; //1、new的基本語(yǔ)法 int* func() { //在堆區(qū)創(chuàng)建整型數(shù)據(jù) //new返回的是 該數(shù)據(jù)類型的指針 int * p = new int(10); return p; } void test01() { int * p = func(); cout << *p << endl; cout << *p << endl; cout << *p << endl; //堆區(qū)的數(shù)據(jù) 由程序員管理開辟,程序員管理釋放 //如果想釋放堆區(qū)的數(shù)據(jù),利用關(guān)鍵字 delete delete p; //cout << *p << endl; //內(nèi)存已經(jīng)釋放,再次訪問是非法操作,會(huì)報(bào)錯(cuò) } //2、在堆區(qū)利用new開辟一個(gè)數(shù)組 void test02() { //創(chuàng)建10整型數(shù)組,在堆區(qū) int * arr = new int[10]; //10代表數(shù)組有10個(gè)元素 for (int i = 0; i < 10; i++) { arr[i] = i + 100; //給10個(gè)元素賦值 100~109 } for (int i = 0; i < 10; i++) { cout << arr[i] << endl; } //釋放堆區(qū)的數(shù)組 //釋放數(shù)組的時(shí)候 要加【】才可以 delete[] arr; } int main() { test01(); test02(); system("pause"); return 0; }
到此這篇關(guān)于C++核心編程之內(nèi)存分區(qū)模型詳解的文章就介紹到這了,更多相關(guān)C++內(nèi)存分區(qū)模型內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C語(yǔ)言中關(guān)于計(jì)算字符串長(zhǎng)度的幾種方式
這篇文章主要介紹了C語(yǔ)言中關(guān)于計(jì)算字符串長(zhǎng)度的幾種方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-08-08C語(yǔ)言數(shù)據(jù)結(jié)構(gòu)之堆排序源代碼
這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言數(shù)據(jù)結(jié)構(gòu)之堆排序源代碼,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-01-01C++函數(shù)三種傳參形式(指針傳遞、引用傳遞、值傳遞)
不論是哪種參數(shù)傳遞方式,都有形參和實(shí)參之分,本文主要介紹了C++函數(shù)三種傳參形式(指針傳遞、引用傳遞、值傳遞),具有一定的參考價(jià)值,感興趣的可以了解一下2024-03-03visual studio 2013中配置opencv圖文教程 Opencv2.4.9安裝配置教程
這篇文章主要為大家詳細(xì)介紹了Opencv2.4.9安裝教程,以及在visualstudio 2013中opencv的配置步驟,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-04-04