C++ 內(nèi)存分區(qū)模型的使用(代碼區(qū)、全局區(qū)、棧區(qū)、堆區(qū)、new)
更新時間:2021年04月25日 11:23:51 作者:小猿筆記
這篇文章主要介紹了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)強制轉(zhuǎn)換為10進制
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ù)組的時候,要加[]才可以,否則認為是只是放一個元素
delete[] arr;
}
int main()
{
test();
system("pause");
return 0;
}

注意:
- 釋放堆取數(shù)組
- 釋放數(shù)組的時候,要加[]才可以,否則認為是只是放一個元素
參考:
到此這篇關(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)方法
下面我們將通過程序給大家演示基于對話框的應用程序?qū)M_KEYDOWN消息的捕獲。需要的朋友可以參考下2013-05-05
Qt QChart 創(chuàng)建圖表的實現(xiàn)方法
這篇文章主要介紹了Qt QChart 創(chuàng)建圖表的實現(xiàn)方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2020-12-12

