内存分区模型
- 代码区:存放函数体的二进制代码,由操作系统管理的
- 全局区:存放全局变量和静态变量以及常量
- 栈区:由编辑器自动分配释放,存放函数的参数值,局部变量等
- 堆区:由程序员分配和释放,如程序员不释放,程序结束时由操作系统自动回收。
不同的区域生命周期不同,方便程序员进行编程
程序运行前
在编译后生成exe可执行程序,未执行前的程序分为两个区域
代码区
存放CPU执行的机器指令(二进制)
代码区是**共享**的。共享的目的是对于频繁执行的程序只需要一份代码即可
代码区是**只读**的,防止程序意外被修改
全局区
全局变量和静态变量存放的地方
全局区还包含了常量区,字符串常量和其他常量
该区域的数据在执行程序以后由操作系统释放
C++中在程序运行前分为全局区和代码区
优码区特点是共亨和只读
全局区中存放全局变量、静态变是、常量
常量区中存放 const修饰的全局常量 和字符串常量
栈区
由编译器自动分配释放,存放函数的参数值局部变量等
注意事项:不要返回局部变量的地址,栈区开辟的数据由编译器自动释放
#include <iostream>
#include <string>
using namespace std;
int* func(){
int a=10;
return &a;
}
int main(){
int * p=func();
cout<<*p<<endl;//自动释放
cout<<*p<<endl;
return 0;
}
//输出10和0
堆区
由程序员分配和释放,如程序员不释放,程序结束时由操作系统自动回收。
在c++中主要利用new在堆区开辟数据
#include <iostream>
#include <string>
using namespace std;
void func(){
//利用new关键字,可以将数据开辟到堆区
//指针本质也是局部变量,保存到堆区
//这里new开辟堆区新空间为:0x001,new返回的是该类型的指针,那么int *p栈区里面的值为0x001
int * p=new int(10);
return p;
}
int main(){
int * p=func();
cout<<*p<<endl;
//一旦删除就失去改地址0x001的访问权限,再次操作就会出现报错
delete p;
//删除数组delete[] arr;
return 0;
}