[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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章