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)強制轉換為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;
}


總結

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關鍵字,將數(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;//與上一個程序對比,多輸出幾次
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;//與上一個程序對比,多輸出幾次
cout << *q << endl;
cout << *q << endl;
//堆區(qū)數(shù)據(jù)是由程序員管理開辟、管理釋放
//如果想釋放堆區(qū)數(shù)據(jù),利用關鍵字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ù)組的時候,要加[]才可以,否則認為是只是放一個元素
參考:
到此這篇關于C++ 內(nèi)存分區(qū)模型的使用(代碼區(qū)、全局區(qū)、棧區(qū)、堆區(qū)、new)的文章就介紹到這了,更多相關C++ 內(nèi)存分區(qū)模型內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Java3D實例之創(chuàng)建空間幾何模型的實現(xiàn)方法
本篇文章是對Java3D 創(chuàng)建空間幾何模型的實現(xiàn)方法進行了詳細的介紹。需要的朋友參考下2013-05-05
C/C++百行代碼實現(xiàn)熱門游戲消消樂功能的示例代碼
這篇文章主要介紹了C/C++百行代碼實現(xiàn)熱門游戲消消樂功能的示例代碼,本文通過圖文并茂的形式給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-07-07
C++ OpenCV實戰(zhàn)之標記點檢測的實現(xiàn)
這篇文章主要介紹了如何利用C++ OpenCV實現(xiàn)關鍵點的檢測,文中的示例代碼講解詳細,對我們學習OpenCV有一定幫助,感興趣的小伙伴可以了解一下2022-03-03
C語言字符函數(shù)、內(nèi)存函數(shù)功能及實現(xiàn)代碼
這篇文章主要介紹了C語言字符函數(shù)、內(nèi)存函數(shù) 功能及實現(xiàn),本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2021-02-02
Qt實現(xiàn)QLineEdit輸入前提示輸入范圍并用正則表達式限制輸入范圍
在日常開發(fā)過程中QLineEdit作為輸入框,有時要限制輸入的內(nèi)容,這篇文章主要給大家介紹了關于Qt實現(xiàn)QLineEdit輸入前提示輸入范圍并用正則表達式限制輸入范圍的相關資料,文中通過代碼介紹的非常詳細,需要的朋友可以參考下2024-05-05
Cocos2d-x中使用CCScrollView來實現(xiàn)關卡選擇實例
這篇文章主要介紹了Cocos2d-x中使用CCScrollView來實現(xiàn)關卡的選擇實例,本文在代碼中用大量注釋講解了CCScrollView的使用,需要的朋友可以參考下2014-09-09

