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<

             cout<<*p<

        }

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

              

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

           int* func()

          {

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

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

                 指针所指的值放在堆区

              return p;

          }

          int main()

         {

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

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

             cout<<*p<

             cout<<*p<

         }

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<

    }

    delete[] arr;//释放堆区数组,注意加[]

}

int main()

{

test01();

return 0;

}

       

你可能感兴趣的:(C++编程,c++,开发语言)