C++ 內存分區模型的使用(代碼區、全局區、棧區、堆區、new)

內存分區模型

在這裡插入圖片描述

1 代碼區

在這裡插入圖片描述

在這裡插入圖片描述

2 全局區

// 全局變量、靜態變量、常量

在這裡插入圖片描述

#include <iostream>
using namespace std;

// 全局變量、靜態變量、常量

//全局變量
int g_a=10;
int g_b=10;

//const修飾的全局常量
const int c_g_a = 10;
const int c_g_b = 10;

int main()
{
	//創建普通局部變量
	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;

	//靜態變量
	static int s_a = 10;
	static int s_b = 10;
	cout << "靜態變量s_a的地址為:" << (int)&s_a << endl;
	cout << "靜態變量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 棧區

在這裡插入圖片描述

棧區註意事項

  • 不要返回局部變量的地址
  • 棧區的數據由編譯器管理開辟和釋放
#include <iostream>
using namespace std;

//棧區註意事項
//不要返回局部變量的地址
//棧區的數據由編譯器管理開辟和釋放

int *func(int b)//形參數據也存放在棧區
{
	b = 100;
	int a = 10;//局部變量:存放在棧區,棧區的數據在函數執行完畢自動釋放
	return &a;//返回局部變量的地址
}
int main()
{
	//接受func函數的返回值
	int *p=func(1);
	cout << *p << endl;//第一次可以打印正確的數字,因為編譯做瞭一次保留
	cout << *p << endl;//第二次,就沒瞭,輸出亂碼

	system("pause");
	return 0;
}

在這裡插入圖片描述

4 堆區

在這裡插入圖片描述

在這裡插入圖片描述

#include <iostream>
using namespace std;
int *func()
{
	//利用new關鍵字,將數據開辟到堆區
	//指針本質也是局部變量,存放在棧上,指針保存的數據存放咋堆區
	int* p = new int(10);
	return p;
}
int main()
{
	//在堆區開辟數據
	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()
{
	//在堆區創建整形數據
	//new返回的是數據類型指針
	int* p = new int(10);
	return p;
}
//2.在堆區利用new 開辟數組
int main()
{
	//在堆區開辟數據
	int* q = func();
	cout << *q << endl;//與上一個程序對比,多輸出幾次
	cout << *q << endl;
	cout << *q << endl;

	//堆區數據是由程序員管理開辟、管理釋放
	//如果想釋放堆區數據,利用關鍵字delete
	delete q;
	cout << *q << endl;//內存已被釋放,再次訪問就是非法操作,報錯

	system("pause");
	return 0;
}

在這裡插入圖片描述

在這裡插入圖片描述

#include <iostream>
using namespace std;

//1.new的基本語法


//2.在堆區利用new 開辟數組
void test()
{
	//創建10整形數據的數組,在堆區
	int *arr =new int[10];//10代表數組有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;

	//釋放堆取數組
	//釋放數組的時候,要加[]才可以,否則認為是隻是放一個元素
	delete[] arr;
}
int main()
{
	test();
	system("pause");
	return 0;
}

在這裡插入圖片描述

註意:

  • 釋放堆取數組
  • 釋放數組的時候,要加[]才可以,否則認為是隻是放一個元素

參考:

嗶哩嗶哩 黑馬程序員

到此這篇關於C++ 內存分區模型的使用(代碼區、全局區、棧區、堆區、new)的文章就介紹到這瞭,更多相關C++ 內存分區模型內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!

推薦閱讀: