C++笔记(二)之核心编程(一)内存分区模型

一.内存分区模型

c++程序执行时,将内存大致分为四个区域

  • 代码区:存放函数的二进制代码,由操作系统进行管理(共享、只读)
  • 全局区:存放全局变量,静态变量以及常量(结束后,有操作系统释放)
  • 栈区:由编译器自动分配释放,存放函数的参数数值,局部变量等
  • 堆区:由程序员分配和释放,若程序员结束时由操作系统回收
  1. 全局区:全局变量、静态变量、常量(字符串常量、const修饰的全局变量)

    include
    using namepase std;
    
    //全局变量
    int q_a=10;
    int q_b=10;
    //const修饰的全局常量
    const int c_q_a=10;
    const int c_q_a=10;
    int main()
    {
     //全局区
     //全局变量、静态变量、常量
    //创建普通局部变量
     int a=10;
     int b=10;
    //这两个局部变量的地址相差不大,说明是储存在同一个区域内
     cout <<"局部变量a的地址为:"<<(int)&a<
  2. 栈区:注意不要返回局部变量的地址,栈区的数据由编译器自动释放

    include
    using namepase std;
    
    int fun(int b)//形参数据会放在栈区
    {
     int a=10;//局部变量存储在栈区,栈区数据在函数执行完后自动释放
     return &a;//返回局部变量的地址
    }
    
    int main()
    {
     int *p=fun(1);//接受fun函数的返回值
     cout<<*p<

    3.堆区

    include
    using namepase std;
    
    int fun()
    {
    //利用new关键字,可以将数据开辟到堆区
     int *p = new int (10);//指针本质是局部变量,放在栈上,指针保存的数据是放在堆区
     return p;
    }
    
    int main()
    {
     int *p = func();
    //因为指针指向的内容是放在堆区,由程序员来释放的,所以这里输出两次以上的数值,它依旧是正确的数值
     cout << *P<

    4.new的操作符

  • c++利用new开辟数据区
  • 堆数据的开辟,由程序员开辟,手动释放,释放利用操作符delete
  • 利用new创建的数据,会返回该数据对应的类型的指针
include
using namepase std;

int fun()
{
//利用new关键字,可以将数据开辟到堆区,返回的是该类型的指针,所以要用指针去接受它
 int *p = new int (10);//指针本质是局部变量,放在栈上,指针保存的数据是放在堆区
 return p;
}

//new的基本操作
void test01()
{
  int *p = func();
  cout << *P<