C++內(nèi)存分區(qū)模型超詳細(xì)講解
1、內(nèi)存分區(qū)模型
C++程序在執(zhí)行時,將內(nèi)存大方向劃分為4個區(qū)域
- 代碼區(qū):存放函數(shù)體的二進(jìn)制代碼,由操作系統(tǒng)進(jìn)行管理的(所有代碼包含中文注釋)
- 全局區(qū):存放全局變量和靜態(tài)變量以及常量
- 棧區(qū):由編譯器自動分配釋放, 存放函數(shù)的參數(shù)值,局部變量等
- 堆區(qū):由程序員分配和釋放,若程序員不釋放,程序結(jié)束時由操作系統(tǒng)回收
內(nèi)存四區(qū)意義:
不同區(qū)域存放的數(shù)據(jù),賦予不同的生命周期, 給我們更大的靈活編程
2、程序運行前
在程序編譯后,生成了exe可執(zhí)行程序,未執(zhí)行該程序前分為兩個區(qū)域:
代碼區(qū):
? 存放 CPU 執(zhí)行的機(jī)器指令;
? 代碼區(qū)是共享的,共享的目的是對于頻繁被執(zhí)行的程序,只需要在內(nèi)存中有一份代碼即可;
? 代碼區(qū)是只讀的,使其只讀的原因是防止程序意外地修改了它的指令;
全局區(qū):
? 全局變量和靜態(tài)變量存放在此.
? 全局區(qū)還包含了常量區(qū), 字符串常量和其他常量也存放在此.
該區(qū)域的數(shù)據(jù)在程序結(jié)束后由操作系統(tǒng)釋放.
總結(jié):
- C++中在程序運行前分為全局區(qū)和代碼區(qū)
- 代碼區(qū)特點是共享和只讀
- 全局區(qū)中存放全局變量、靜態(tài)變量、常量
- 常量區(qū)中存放 const修飾的全局常量 和 字符串常量
3、程序運行后
棧區(qū):
? 由編譯器自動分配釋放, 存放函數(shù)的參數(shù)值,局部變量等
? 注意事項:不要返回局部變量的地址,棧區(qū)開辟的數(shù)據(jù)由編譯器自動釋放
示例:
int * func() { int a = 10; return &a; } int main() { int *p = func(); cout << *p << endl; cout << *p << endl; system("pause"); return 0; }
堆區(qū):
? 由程序員分配釋放,若程序員不釋放,程序結(jié)束時由操作系統(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ū),返回數(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ù),由程序員手動開辟,手動釋放,釋放利用操作符:delete
? 語法:new 數(shù)據(jù)類型
? 利用new創(chuàng)建的數(shù)據(jù),會返回該數(shù)據(jù)對應(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; //報錯,釋放的空間不可訪問 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)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C++實現(xiàn)中綴表達(dá)式轉(zhuǎn)化為后綴表達(dá)式詳解
這篇文章主要為大家詳細(xì)介紹了如何利用C++解決實現(xiàn)中綴表達(dá)式轉(zhuǎn)換為后綴表達(dá)式的問題,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2022-03-03QT中QDataStream二進(jìn)制數(shù)據(jù)讀寫的實現(xiàn)
本文主要介紹了QT中QDataStream二進(jìn)制數(shù)據(jù)讀寫的實現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-08-08C/C++使用socket實現(xiàn)判斷ip是否能連通
這篇文章主要為大家詳細(xì)介紹了C/C++如何使用socket實現(xiàn)判斷ip是否能連通,文中的示例代碼講解詳細(xì),具有一定的學(xué)習(xí)價值,感興趣的小伙伴可以了解一下2023-07-07