C++ 內(nèi)存分區(qū)模型的使用(代碼區(qū)、全局區(qū)、棧區(qū)、堆區(qū)、new)
更新時間:2021年04月25日 11:23:51 作者:小猿筆記
這篇文章主要介紹了C++ 內(nèi)存分區(qū)模型的使用(代碼區(qū)、全局區(qū)、棧區(qū)、堆區(qū)、new),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
內(nèi)存分區(qū)模型
1 代碼區(qū)
2 全局區(qū)
// 全局變量、靜態(tài)變量、常量
#include <iostream> using namespace std; // 全局變量、靜態(tài)變量、常量 //全局變量 int g_a=10; int g_b=10; //const修飾的全局常量 const int c_g_a = 10; const int c_g_b = 10; int main() { //創(chuàng)建普通局部變量 int a = 10; int b = 10; cout << "局部變量a的地址為:" << (int)&a << endl;//&a取地址,(int)強(qiáng)制轉(zhuǎn)換為10進(jìn)制 cout << "局部變量b的地址為:" << (int)&b <<endl<<endl; //全局變量 cout << "全局變量g_a的地址為:" << (int)&g_a << endl; cout << "全局變量g_b的地址為:" << (int)&g_b << endl<<endl; //靜態(tài)變量 static int s_a = 10; static int s_b = 10; cout << "靜態(tài)變量s_a的地址為:" << (int)&s_a << endl; cout << "靜態(tài)變量s_b的地址為:" << (int)&s_b << endl << endl; //常量(字符串常量、const修飾的變量) //字符串常量 cout << "字符串常量的地址為:" << (int)&"hello word" << endl; //const修飾的變量(全局常量、局部常量) //const修飾的全局變量 cout << "全局常量 c_g_a的地址為:" << (int)&c_g_a << endl; cout << "全局常量 c_g_b的地址為:" << (int)&c_g_b << endl; //const修飾的局部變量 const int c_a = 10; const int c_b = 10; cout << "局部常量 c_a的地址為:" << (int)&c_a << endl; cout << "局部常量 c_b的地址為:" << (int)&c_b << endl << endl; system("pause"); return 0; }
總結(jié)
3 棧區(qū)
棧區(qū)注意事項
- 不要返回局部變量的地址
- 棧區(qū)的數(shù)據(jù)由編譯器管理開辟和釋放
#include <iostream> using namespace std; //棧區(qū)注意事項 //不要返回局部變量的地址 //棧區(qū)的數(shù)據(jù)由編譯器管理開辟和釋放 int *func(int b)//形參數(shù)據(jù)也存放在棧區(qū) { b = 100; int a = 10;//局部變量:存放在棧區(qū),棧區(qū)的數(shù)據(jù)在函數(shù)執(zhí)行完畢自動釋放 return &a;//返回局部變量的地址 } int main() { //接受func函數(shù)的返回值 int *p=func(1); cout << *p << endl;//第一次可以打印正確的數(shù)字,因為編譯做了一次保留 cout << *p << endl;//第二次,就沒了,輸出亂碼 system("pause"); return 0; }
4 堆區(qū)
#include <iostream> using namespace std; int *func() { //利用new關(guān)鍵字,將數(shù)據(jù)開辟到堆區(qū) //指針本質(zhì)也是局部變量,存放在棧上,指針保存的數(shù)據(jù)存放咋堆區(qū) int* p = new int(10); return p; } int main() { //在堆區(qū)開辟數(shù)據(jù) int* q = func(); cout << *q << endl;//與上一個程序?qū)Ρ?,多輸出幾? cout << *q << endl; cout << *q << endl; cout << *q << endl; system("pause"); return 0; }
5 new運算符
#include <iostream> using namespace std; //1.new的基本語法 int* func() { //在堆區(qū)創(chuàng)建整形數(shù)據(jù) //new返回的是數(shù)據(jù)類型指針 int* p = new int(10); return p; } //2.在堆區(qū)利用new 開辟數(shù)組 int main() { //在堆區(qū)開辟數(shù)據(jù) int* q = func(); cout << *q << endl;//與上一個程序?qū)Ρ龋噍敵鰩状? cout << *q << endl; cout << *q << endl; //堆區(qū)數(shù)據(jù)是由程序員管理開辟、管理釋放 //如果想釋放堆區(qū)數(shù)據(jù),利用關(guān)鍵字delete delete q; cout << *q << endl;//內(nèi)存已被釋放,再次訪問就是非法操作,報錯 system("pause"); return 0; }
#include <iostream> using namespace std; //1.new的基本語法 //2.在堆區(qū)利用new 開辟數(shù)組 void test() { //創(chuàng)建10整形數(shù)據(jù)的數(shù)組,在堆區(qū) int *arr =new int[10];//10代表數(shù)組有10個元素 for (int i = 0; i < 10; i++) { arr[i] = i + 100;//給10個元素賦值,100~109 } for (int i = 0; i < 10; i++) cout << arr[i] << endl; //釋放堆取數(shù)組 //釋放數(shù)組的時候,要加[]才可以,否則認(rèn)為是只是放一個元素 delete[] arr; } int main() { test(); system("pause"); return 0; }
注意:
- 釋放堆取數(shù)組
- 釋放數(shù)組的時候,要加[]才可以,否則認(rèn)為是只是放一個元素
參考:
到此這篇關(guān)于C++ 內(nèi)存分區(qū)模型的使用(代碼區(qū)、全局區(qū)、棧區(qū)、堆區(qū)、new)的文章就介紹到這了,更多相關(guān)C++ 內(nèi)存分區(qū)模型內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
基于對話框程序中讓對話框捕獲WM_KEYDOWN消息的實現(xiàn)方法
下面我們將通過程序給大家演示基于對話框的應(yīng)用程序?qū)M_KEYDOWN消息的捕獲。需要的朋友可以參考下2013-05-05使用代碼驗證linux子進(jìn)程與父進(jìn)程的關(guān)系
Linux下父進(jìn)程可以使用fork 函數(shù)創(chuàng)建子進(jìn)程,但是當(dāng)父進(jìn)程先退出后,子進(jìn)程會不會也退出呢?通過下面這個小實驗,我們能夠很好的看出來2014-02-02Qt QChart 創(chuàng)建圖表的實現(xiàn)方法
這篇文章主要介紹了Qt QChart 創(chuàng)建圖表的實現(xiàn)方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-12-12