C++內(nèi)存分區(qū)模型超詳細(xì)講解
1、內(nèi)存分區(qū)模型
C++程序在執(zhí)行時(shí),將內(nèi)存大方向劃分為4個(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ù),賦予不同的生命周期, 給我們更大的靈活編程
2、程序運(yùn)行前
在程序編譯后,生成了exe可執(zhí)行程序,未執(zhí)行該程序前分為兩個(gè)區(qū)域:
代碼區(qū):
? 存放 CPU 執(zhí)行的機(jī)器指令;
? 代碼區(qū)是共享的,共享的目的是對(duì)于頻繁被執(zhí)行的程序,只需要在內(nèi)存中有一份代碼即可;
? 代碼區(qū)是只讀的,使其只讀的原因是防止程序意外地修改了它的指令;
全局區(qū):
? 全局變量和靜態(tài)變量存放在此.
? 全局區(qū)還包含了常量區(qū), 字符串常量和其他常量也存放在此.
該區(qū)域的數(shù)據(jù)在程序結(jié)束后由操作系統(tǒng)釋放.


總結(jié):
- C++中在程序運(yùn)行前分為全局區(qū)和代碼區(qū)
- 代碼區(qū)特點(diǎn)是共享和只讀
- 全局區(qū)中存放全局變量、靜態(tài)變量、常量
- 常量區(qū)中存放 const修飾的全局常量 和 字符串常量
3、程序運(yùn)行后
棧區(qū):
? 由編譯器自動(dòng)分配釋放, 存放函數(shù)的參數(shù)值,局部變量等
? 注意事項(xiàng):不要返回局部變量的地址,棧區(qū)開辟的數(shù)據(jù)由編譯器自動(dòng)釋放
示例:
int * func()
{
int a = 10;
return &a;
}
int main() {
int *p = func();
cout << *p << endl;
cout << *p << endl;
system("pause");
return 0;
}堆區(qū):
? 由程序員分配釋放,若程序員不釋放,程序結(jié)束時(shí)由操作系統(tǒng)回收
? 在C++中主要利用new在堆區(qū)開辟內(nèi)存
int* func()
{
// 利用new關(guān)鍵字,可以將數(shù)據(jù)開辟到堆區(qū)
// 指針 本質(zhì)上是局部變量,放在棧區(qū),指針保存的數(shù)據(jù)放在堆區(qū)
int* a = new int(10); // new,開辟數(shù)據(jù)到堆區(qū),返回?cái)?shù)據(jù)地址
return a;
}
int main() {
int *p = func();
cout << *p << endl;
cout << *p << endl;
system("pause");
return 0;
}
4、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)的類型的指針
int* func()
{
int* a = new int(10);
return a;
}
int main() {
int *p = func();
cout << *p << endl;
cout << *p << endl;
// 堆區(qū)的數(shù)據(jù),由程序員管理開辟(new),程序員管理釋放(delete)
// 利用delete釋放堆區(qū)數(shù)據(jù)
delete p;
//cout << *p << endl; //報(bào)錯(cuò),釋放的空間不可訪問(wèn)
system("pause");
return 0;
}示例:開辟數(shù)組
//堆區(qū)開辟數(shù)組
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;
}
//釋放數(shù)組 delete 后加 []
delete[] arr;
system("pause");
return 0;
}到此這篇關(guān)于C++內(nèi)存分區(qū)模型超詳細(xì)講解的文章就介紹到這了,更多相關(guān)C++內(nèi)存分區(qū)模型內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C++語(yǔ)言const 關(guān)鍵字使用方法圖文詳解
在類中,如果你不希望某些數(shù)據(jù)被修改,可以使用const關(guān)鍵字加以限定。const 可以用來(lái)修飾成員變量、成員函數(shù)以及對(duì)象2020-01-01
C語(yǔ)言的字符函數(shù)和字符串函數(shù)詳解
這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言的字符函數(shù)和字符串函數(shù),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助2022-03-03
如何為Qt視圖中的文字實(shí)現(xiàn)彩虹漸變效果
這篇文章主要給大家介紹了關(guān)于如何為Qt視圖中的文字實(shí)現(xiàn)彩虹漸變效果的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者使用Qt具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-03-03
C++實(shí)現(xiàn)中綴表達(dá)式轉(zhuǎn)化為后綴表達(dá)式詳解
這篇文章主要為大家詳細(xì)介紹了如何利用C++解決實(shí)現(xiàn)中綴表達(dá)式轉(zhuǎn)換為后綴表達(dá)式的問(wèn)題,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-03-03
QT中QDataStream二進(jìn)制數(shù)據(jù)讀寫的實(shí)現(xiàn)
本文主要介紹了QT中QDataStream二進(jìn)制數(shù)據(jù)讀寫的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-08-08
C/C++使用socket實(shí)現(xiàn)判斷ip是否能連通
這篇文章主要為大家詳細(xì)介紹了C/C++如何使用socket實(shí)現(xiàn)判斷ip是否能連通,文中的示例代碼講解詳細(xì),具有一定的學(xué)習(xí)價(jià)值,感興趣的小伙伴可以了解一下2023-07-07
C語(yǔ)言如何實(shí)現(xiàn)循環(huán)輸入
這篇文章主要介紹了C語(yǔ)言如何實(shí)現(xiàn)循環(huán)輸入問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-02-02
舉例理解C語(yǔ)言二維數(shù)組的指針指向問(wèn)題
這篇文章主要介紹了C語(yǔ)言二維數(shù)組的指針指向問(wèn)題,文中不建議用二級(jí)指針來(lái)訪問(wèn)二維數(shù)組,需要的朋友可以參考下2015-12-12

