C++ 內(nèi)存分區(qū)模型的使用(代碼區(qū)、全局區(qū)、棧區(qū)、堆區(qū)、new)
內(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ū)注意事項(xiàng)
- 不要返回局部變量的地址
- 棧區(qū)的數(shù)據(jù)由編譯器管理開(kāi)辟和釋放
#include <iostream>
using namespace std;
//棧區(qū)注意事項(xiàng)
//不要返回局部變量的地址
//棧區(qū)的數(shù)據(jù)由編譯器管理開(kāi)辟和釋放
int *func(int b)//形參數(shù)據(jù)也存放在棧區(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;//第一次可以打印正確的數(shù)字,因?yàn)榫幾g做了一次保留
cout << *p << endl;//第二次,就沒(méi)了,輸出亂碼
system("pause");
return 0;
}

4 堆區(qū)


#include <iostream>
using namespace std;
int *func()
{
//利用new關(guān)鍵字,將數(shù)據(jù)開(kāi)辟到堆區(qū)
//指針本質(zhì)也是局部變量,存放在棧上,指針保存的數(shù)據(jù)存放咋堆區(qū)
int* p = new int(10);
return p;
}
int main()
{
//在堆區(qū)開(kāi)辟數(shù)據(jù)
int* q = func();
cout << *q << endl;//與上一個(gè)程序?qū)Ρ?,多輸出幾?
cout << *q << endl;
cout << *q << endl;
cout << *q << endl;
system("pause");
return 0;
}

5 new運(yùn)算符

#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;
}
//2.在堆區(qū)利用new 開(kāi)辟數(shù)組
int main()
{
//在堆區(qū)開(kāi)辟數(shù)據(jù)
int* q = func();
cout << *q << endl;//與上一個(gè)程序?qū)Ρ龋噍敵鰩状?
cout << *q << endl;
cout << *q << endl;
//堆區(qū)數(shù)據(jù)是由程序員管理開(kāi)辟、管理釋放
//如果想釋放堆區(qū)數(shù)據(jù),利用關(guān)鍵字delete
delete q;
cout << *q << endl;//內(nèi)存已被釋放,再次訪問(wèn)就是非法操作,報(bào)錯(cuò)
system("pause");
return 0;
}


#include <iostream>
using namespace std;
//1.new的基本語(yǔ)法
//2.在堆區(qū)利用new 開(kāi)辟數(shù)組
void test()
{
//創(chuàng)建10整形數(shù)據(jù)的數(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;
//釋放堆取數(shù)組
//釋放數(shù)組的時(shí)候,要加[]才可以,否則認(rèn)為是只是放一個(gè)元素
delete[] arr;
}
int main()
{
test();
system("pause");
return 0;
}

注意:
- 釋放堆取數(shù)組
- 釋放數(shù)組的時(shí)候,要加[]才可以,否則認(rèn)為是只是放一個(gè)元素
參考:
到此這篇關(guān)于C++ 內(nèi)存分區(qū)模型的使用(代碼區(qū)、全局區(qū)、棧區(qū)、堆區(qū)、new)的文章就介紹到這了,更多相關(guān)C++ 內(nèi)存分區(qū)模型內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
c語(yǔ)言中main函數(shù)用法及知識(shí)點(diǎn)總結(jié)
在本篇文章里小編給大家分享的是一篇關(guān)于c語(yǔ)言中main函數(shù)用法及知識(shí)點(diǎn)總結(jié)內(nèi)容,有需要的朋友們可以跟著學(xué)習(xí)參考下。2021-10-10
基于對(duì)話框程序中讓對(duì)話框捕獲WM_KEYDOWN消息的實(shí)現(xiàn)方法
下面我們將通過(guò)程序給大家演示基于對(duì)話框的應(yīng)用程序?qū)M_KEYDOWN消息的捕獲。需要的朋友可以參考下2013-05-05
使用代碼驗(yàn)證linux子進(jìn)程與父進(jìn)程的關(guān)系
Linux下父進(jìn)程可以使用fork 函數(shù)創(chuàng)建子進(jìn)程,但是當(dāng)父進(jìn)程先退出后,子進(jìn)程會(huì)不會(huì)也退出呢?通過(guò)下面這個(gè)小實(shí)驗(yàn),我們能夠很好的看出來(lái)2014-02-02
C++ 實(shí)現(xiàn)靜態(tài)單鏈表的實(shí)例
這篇文章主要介紹了C++ 實(shí)現(xiàn)靜態(tài)單鏈表的實(shí)例的相關(guān)資料,需要的朋友可以參考下2017-06-06
Qt QChart 創(chuàng)建圖表的實(shí)現(xiàn)方法
這篇文章主要介紹了Qt QChart 創(chuàng)建圖表的實(shí)現(xiàn)方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-12-12

