C++内存分区模式

100 阅读2分钟

内存分区模型

  1. 代码区:存放函数体的二进制代码,由操作系统管理的
  2. 全局区:存放全局变量和静态变量以及常量
  3. 栈区:由编辑器自动分配释放,存放函数的参数值,局部变量等
  4. 堆区:由程序员分配和释放,如程序员不释放,程序结束时由操作系统自动回收。

不同的区域生命周期不同,方便程序员进行编程

程序运行前

在编译后生成exe可执行程序,未执行前的程序分为两个区域

代码区

  存放CPU执行的机器指令(二进制)
  代码区是**共享**的。共享的目的是对于频繁执行的程序只需要一份代码即可
  代码区是**只读**的,防止程序意外被修改

全局区

  全局变量和静态变量存放的地方
  全局区还包含了常量区,字符串常量和其他常量
  该区域的数据在执行程序以后由操作系统释放

image.png 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;
}