程序的內存模型 內存四區

程序的內存模型(內存四區),C++程序在執行時,將內存大方向劃分爲4個區域:

在程序編譯後,生成了exe可執行程序,未執行該程序前分爲兩個區域(代碼區全局區

代碼區:存放函數體的二進制代碼,由操作系統進行管理

存放CPU執行的機器指令。

代碼區是共享的,共享的目的是對於頻繁被執行的程序,只需要在內存中有一份代碼即可。

代碼區是隻讀的,使其只讀的原因是防止程序意外地修改了它的指令

全局區:存放全局變量和靜態變量以及常量

全局變量和靜態變量存放在此

全局區還包含了常量區,字符串常量和其他常量也存放在此處

該區域的數據在程序結束後由操作系統釋放

#include<iostream>
using namespace std;

/*全局變量*/
int c = 10;
int d = 10;

/*const修飾全局常量*/
const int g = 10;
const int h = 10;

int main()
{
	/*全局區*/

	/*靜態變量  在普通變量前加static,屬於靜態變量*/
	static int e = 10;
	static int f = 10;

	/*創建普通局部變量*/
	int a = 10;
	int b = 10;

	/*const修飾局部常量*/
	const int s = 10;
	const int m = 10;

	/*常量 1.字符串常量 */
	cout << "字符串常量的地址爲:" << (int)&"hello word" << endl;
	cout << endl;

	cout << "局部變量a的地址爲:" << (int)&a << endl;
	cout << "局部變量b的地址爲:" << (int)&b << endl;
	cout << endl;

	cout << "全局變量c的地址爲:" << (int)&c << endl;
	cout << "全局變量d的地址爲:" << (int)&d << endl;
	cout << endl;

	cout << "靜態變量e的地址爲:" << (int)&e << endl;
	cout << "靜態變量f的地址爲:" << (int)&f << endl;
	cout << endl;

	cout << "const修飾的全局常量g的地址爲:" << (int)&g << endl;
	cout << "const修飾的全局常量h的地址爲:" << (int)&h << endl;
	cout << endl;

	cout << "const修飾的局部常量s的地址爲:" << (int)&s << endl;
	cout << "const修飾的局部常量m的地址爲:" << (int)&m << endl;
	cout << endl;

	system("pause");
	return 0;
}

總結:C++中在程序運行前分爲全局區和代碼區

           代碼區特點是共享和只讀

           全局區中存放全局變量,靜態變量,常量

           常量區中存放const修飾的全局常量和字符串常量

 

棧區:由編譯器自動分配釋放,存放函數的參數值,局部變量等

#include<iostream>
using namespace std;

/*
棧區數據的注意事項--不要返回局部變量地址
棧區的數據由編譯器管理開闢和釋放
*/
int * fun()
{
	int a = 10; //局部變量,存放在棧區,棧區的數據在函數執行完後自動釋放
	return &a; //返回局部變量的地址
}

int main()
{
	int * p = fun(); //接收fun函數的返回值

	cout << * p << endl;  //第一次可以打印正確的數字,因爲編譯器做了保留
	cout << * p << endl; //第二次這個數據就不再保留了,此塊內存已被釋放

	system("pause");
	return 0;
}

 

注意事項:不要返回局部變量的地址,棧區開闢的數據由編譯器自動釋放

 

堆區:由程序員分配和釋放,若程序員不釋放,程序結束時由操作系統收回

           C++中主要利用new在堆區開闢內存

#include<iostream>
using namespace std;

/*
棧區數據的注意事項--不要返回局部變量地址
棧區的數據由編譯器管理開闢和釋放
*/
int * fun() //形參數據也會放在棧區
{
	//利用new關鍵字,可以將數據開闢到堆區
	//指針本質是局部變量 ,放在棧上。指針保存的數據放在堆區
	int* p = new int(10);
	return p;
}

int main()
{
	//在堆區開闢數據
	int * p = fun(); //接收fun函數的返回值
	cout << * p << endl;  
	
	system("pause");
	return 0;
}

 補充:new操作符

C++中利用new操作符在堆區開闢數據,堆區開闢的數據,由程序員受到開闢,手動釋放,釋放利用操作符delete 

語法:new 數據類型

利用new創建的數據,會返回該數據對應的類型的指針

#include<iostream>
using namespace std;

/*new的基本語法*/
int* func()
{
	/*在堆區創建整形數據
	new返回的是該數據類型的指針*/
	int* p = new int(10);
	return p;
}

void text01()
{
	int* p = func();
	cout << *p << endl;
	//堆區數據由程序員管理釋放
	delete p; 
//	cout << *p << endl;   內存已經釋放,再次訪問就是非法操作,會報錯
}

void text02()
{
	/*創建10個整形數據的數組,在堆區*/
	int* arr = new int[10];

	for (int i = 0; i < 10; i++)
	{
		arr[i] = i + 100;
	}

	for (int i = 0; i < 10; i++)
	{
		cout << arr[i] << endl;
	}

	//釋放堆區數組
	//釋放數組的時候,要加[]纔可以
	delete[]arr;
}

int main()
{
	//text01();
	text02();
	system("pause");
	return 0;
}

內存四區的意義

不同區域存放的數據,賦予不同的生命週期,給我們更大的靈活編程。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章