c++之内存模型

内存分区模型:

C++程序在执行时,将内存大方向划分为4个区域
代码区:存放函数体的二进制代码,由操作系统进行管理
(你写的代码都转化成二进制代码)
全局区:存放全局变量和静态变量以及常量
栈区:由编译器自动分配和释放,存放函数的参数值,局部变量等
堆区:由程序员分配和释放,若程序员不释放,程序结束时由操作系统回收
内存四区的意义:
不同区域存放的数据,赋予不同生命周期。

程序运行前:
在程序编译后,生成了exe可执行程序,未执行该程序前分为两个区域:代码区、全局区

#include
using namespace std;


//代码区:存放函数体的二进制代码,由操作系统进行 
//特点:共享  只读 
//全局区:静态变量和全局变量存放在此(包含了常量区、字符串常量和其他常量)
//结束后数据由操作系统释放 

int b =10;//在函数体外为全局变量 
int main(){
     
	//全局区
	//创建一个普通局部变量
	int a =10;
	cout<<&a<<"   "<<&b<<endl;
	
	// 静态变量 在普通变量前面加static 属于静态变量
	static int c=10;
	cout<<&c<<endl; //输出地址与全区变量相近 说明在一个区 
	
	
	return 0;
}

程序运行之后:栈区

#include
using namespace std;


//栈区:由编译器自动分配和释放,存放函数的参数值,局部变量等
//由由编译器自动分配释放,存放函数的参数值,局部变量,(形参)等
//注意事项:不要返回局部变量的地址,栈区开辟的数据由编译器自动释放

int*func()
{
     
	int a=10;//局部变量  ,存放在栈区,数据在函数执行后自动释放 
	return &a;//返回局部变量的地址 
}
int main(){
     
	//接受func函数的返回值
	int*p=func();
	cout<<*p<<endl;//可以打印正确数字,编译器做了保留
	cout<<*p<<endl;//第二次数据不保留 
	
	
	return 0;
}

堆区:

#include
using namespace std;


//堆区:由程序员分配和释放,若程序员不释放,程序结束时由操作系统回收
//由程序员决定分配释放,程序结束时由操作系统回收
//在C++中主要利用new在堆区开辟内存 


int*func()
{
     
	//利用new关键字 可以将数据开辟到堆区  语法:new 数据类型 
	int*p=new int(10);
	return p;
}
int main(){
     
	//在堆区开辟数据
	int*p=func();//指针是局部变量 在栈区 存放的数据在堆区 
	cout<<*p<<endl;
	delete p;//释放堆区数据 
	
	return 0;
}

你可能感兴趣的:(c++学习记录,c++)