C++核心编程:程序内存模型(代码区,全局区,堆栈区)哪些区由程序员分配哪些区由操作系统回收哪些区由编译器分配与回收?

1.C++执行程序时内存大致分为四个部分:

(前两部分运行前就存在,后两部分运行后才存在)

1)代码区:(.exe执行前就存在,共享只读由操作系统管理

                存放二进制代码

2)全局区:(执行前就存在,由操作系统管理

                      数据在程序结束后由系统释放

                存放全局变量 静态变量 各种常量(常量)

注解:常量又分为:

  • 字符串常量
  • const修饰的变量
    • const修饰的全局变量//上面的相距都不远
    • const修饰的局部变量  //不在全局区                  

(注:局部(local)变量和全局(global)变量放在不同的区域里!)

3)栈区:编译器分配回收(高地址到低地址)

                存放局部变量 函数参数

注解:!!!不要return局部变量的地址!!!

          int* func()//即使定义指针类型,

         {

              int a=10;

              return &a;

         }//执行完成之后会清空栈中数据,返回地址没有意义

        int main()

        {

             int* p=func();

             cout<<*p<<endl;//输出10,编译器暂时作保留

             cout<<*p<<endl;//解引用时这里的数据被回收了,显示乱码

        }

4)堆区:程序员分配回收或操作系统回收(低地址到高地址)

              

           new 运算符(也是关键字),在堆区开辟数据

           int* func()

          {

              int* p=new int(10);//核心:new的返回值是个存放在栈区指向堆区某数据的指针!!

              //指针的本质是“局部变量”,放在栈区,指针被回收,

                 指针所指的值放在堆区

              return p;

          }

          int main()

         {

             int* p=func();//就好比把一个临时变量赋给另一个存活时间比它长的变量,

                                     另一个变量的值就是temp了,无论temp回收与否

             cout<<*p<<endl;

             cout<<*p<<endl;//上下一致

         }

2.newdelete运算符

   1)基本语法

    2)在堆区开辟数组   

int* func()

{

int* p = new int(10);//开辟堆区存放数据值10,返回值为其地址

return p;

}

void test01()

{

int* p = func();

cout << *p << endl;

delete p;

cout << *p << endl;//引发读取访问权限冲突

}

 void test02()

{

        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();

return 0;

}

       

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值