内存空间的布局

每个应用都有自己独立的内存空间,其内存空间一般都有以下几大区域
   代码段(代码区):用于存放代码.
   数据段(全局区):用于存放全局变量(在C/C++中,定义在函数外面的就是全局变量,全局变量特点是整个程序运行过程中都存在,只要是全局变量它的内存会一直存在,比如植物大战僵尸,不可能把所有的植物和僵尸都变为全局变量,生命周期一直都存在,而且全局变量每个人都可以改,也无法控制权限).
   栈空间:每调用一个函数就会给它分配一段连续的栈空间,等函数调用完毕后会自动回收这段栈空间.自动分配和回收.
   堆空间:需要主动去申请和释放,什么时候使用堆空间,因为我们有的时候希望,某一个对象它的生命周期能够延长,控制对象在内存中的生命周期(为了灵活控制对象的生跟死,植物活了,马上在堆空间申请空间,植物就会在堆空间活着,但植物一旦被僵尸咬死了,这个植物就会在堆空间移除,就不占用内存空间),在程序运行过程中,为了能够自由控制内存的生命周期,大小,会经常使用堆空间的内存
   某个应用的内存空间包括下面4大块
   栈空间
   堆空间
   代码区
   全局区
   
   
   int main(){
       // 申请4个字节的堆空间内存
       int *p = (int *)malloc(4);// 通过int类型的指针指向存储的地址值,指针存储地址,就可以通过指针来访问存储的内容           call malloc (07FF678CE1316h)
   
       栈空间                        堆空间
       8个字节(用于存放指针p)           4个字节
   
       // 将10这个值存放到堆空间中去
       *p = 10;
       free(p)
   
       // 向堆空间申请内存也可以用new
       int *p = new int;   //call operator new (07FF678CE119Fh)
       delete p;
   
   
       // 数组申请
       int *p = (int *)malloc(sizeof(int) *10);
       p[0] = 10;
       p[1] = 10;
       p[2] = 10;
       p[3] = 10;
       p[4] = 10;
       p[5] = 10;
       free(p);
   
       或者
       int *p = new int[10];
       delete[] p;
   
   // 总结:堆空间的申请\释放
   malloc \ free
   new \ delete
   new[] \delete[]
   // 注意:
   申请堆空间成功后,会返回那一段内存空间的地址
   申请和是否必须是1对1的关系,不然可能会存在内存泄漏
   
   
   int *p1 = new int; // 内存泄漏
   p1 = new int;
   delete p1;
   
   int size = sizeof(int)
   int *p2 = (int *)malloc(size);
   memset(p,0,4);
   // 从p2开始的4个字节每一个字节都存放0,清空数据,初始化操作
   cout << *p << endl;
   
   
   
   //memset函数是将较大的数据结构(比如对象,数组等)内存清零的比较快的方法
   Person person;
   person.m_id = 1;
   person.m_age = 20;
   person.m_height = 180;
   memset(&person,0,sizeof(person));
   
   Person persons[] = {{1,20,180},{2,25,165},{3,27,17}};
   memset(persons,0,sizeof(persons))
   }
   
   void test1() {
   int *p1 = new int; // 这种情况*p1为垃圾数据,没有初始化
   int *p2 = new int();  // 初始化为0
   int *p3 = new int(5); //4个字节里面存储的5
   int *p4 = new int[3];  // 没有初始化的数组
   int *p5 = new int[3](); // 数组中全部元素初始化为0
   int *p6 = new int[3]{}; // 初始化为0的数组,只要写了大括号,就是初始化为0
   int *p7 = new int[3]{5};// 初始化的数组为5,0,0
   }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值