[c++學習筆記03]:程序的內存模型—內存四區(代碼區,全局區,棧區,堆區)

C++程序在執行時,將內存大方向劃分爲4個區域

  • 代碼區:存放函數體的二進制代碼,由操作系統進行管理的(程序狗寫的
  • 全局區:存放全局變量和靜態變量以及常量
  • 棧區:由編譯器自動分配釋放, 存放函數的參數值,局部變量等
  • 堆區:由程序員分配和釋放,若程序員不釋放,程序結束時由操作系統回收
    代碼區:
    特點:共享(只有一份),只讀(不可修改)
    全局區:
    存放全局變量和靜態變量以及常量
    static int a=10;靜態常量。
    在這裏插入圖片描述
    注意:
    程序在運行之前:
    全局區和代碼區
    代碼區的特點是共享和只讀
    全局區有全局變量,靜態變量,常量
    常量區有const修飾的全局常量和字符串常量。
    const修飾的局部常量,局部變量在棧區
    程序運行之後:
    棧區:
    ////局部變量和形參都在棧區,
    //​//由編譯器自動分配釋放, 存放函數的參數值(形參), 局部變量
    ////注意事項:不要返回局部變量地址,
    棧區開闢的數據由編譯器自動釋放

如下代碼:

#include<iostream>
using namespace std;
#include<string>
#include <cstdlib>//解決system不明確問題。
#include<ctime>
int *dadd(int b) //b形參
{
	b =100;
	int a = 10; 
	return &a;
}
int main()
{	
	int* p= dadd(1);
	////局部變量和形參都在棧區,
	//​//由編譯器自動分配釋放, 存放函數的參數值, 局部變量等
	////注意事項:不要返回局部變量的地址,棧區開闢的數據由編譯器自動釋放
	cout << *p << endl;
	cout << *p << endl;

	system("pause");
	return 0;
}

堆區:
​由程序員分配釋放,若程序員不釋放,程序結束時由操作系統回收。
在C++中主要利用new在堆區開闢內存。
指針其實也是一個局部變量,在棧區,但是指針可以進行存放堆區的地址new 搞定。
堆區由程序員決定其生死

#include<iostream>
using namespace std;
#include<string>
#include <cstdlib>//解決system不明確問題。
#include<ctime>
int *func() //b形參
{
	//指針其實也是一個局部變量,在棧區,但是指針可以進行存放堆區的地址 由new 搞定。
	int *p=new int (10);//new int(10)返回一個堆區的地址,由指針接收。
						//堆區由程序員決定其生死 
	return p;            
}
int main()
{	
	int* p= func();//在堆區開闢數據。
	cout << *p << endl;
	cout << *p << endl;

	system("pause");
	return 0;
}
**C++中利用==new==操作符在堆區開闢數據**

​ 堆區開闢的數據,由程序員手動開闢,手動釋放,釋放利用操作符 delete

​ 語法:new 數據類型

​ 利用new創建的數據,會返回該數據對應的類型的指針
1.基本語法。
2.堆區開闢數組。
代碼如下:

#include<iostream>
using namespace std;
#include<string>
#include <cstdlib>//解決system不明確問題。
#include<ctime>
int *func() //b形參
{
	int *p=new int (10); 
	return p;            
}
void test01()//1.基本語法
{
	int* p = func();
	cout << *p << endl;
	cout << *p << endl;
	cout << *p << endl;
	delete p;//釋放堆區數據
	cout << *p << endl;//報錯,釋放後不可操作。
}
void test02()//2.堆區開闢數組
{
	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()
{	
	//test01();
	test02();
	system("pause");
	return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章