内存空间的布局(栈区、堆区、代码区、全局区)以及堆空间的初始化

一时失言乱红尘 2023-02-20 02:14 87阅读 0赞

代码区(代码段):用于存放代码

全局区(数据段):用于存放全局变量等

栈区:当调用一个函数时,系统就会给他分配一段连续的栈空间,等函数调用 完毕后就会自动回收这段栈空间

堆区:需要主动的去申请和释放

为什么要引入堆区呢?
在程序运行过程中,为了能够自由地控制内存的生命周期、大小,会经常使用堆空间的内存。当我们需要的时候就可以向堆区申请,但是需要手动释放

下面重点讲讲堆区

堆空间的申请和释放:
malloc / free、new / delete、new [ ] / delete [ ]

注意:
1、申请堆空间成功后会返回一段内存地址的空间
2、申请和释放必须是一对一的关系,不然会造成内存泄露
3、new 和 malloc 区别:通过new分配的对象会自动调用构造函数和析构函数(构造函数、析构函数会在后面讲解)
4、申请成功的堆空间的地址是保存在指针中的,一般来说该指针变量是保存在栈区的(误区:不是所有的指针都保存在栈区的)

堆空间的初始化

  1. //堆空间初始化
  2. int *p = (int *)malloc(sizeof(int));//*p未初始化
  3. int *p1 = (int *)malloc(sizeof(int));
  4. memset(p1,0,sizeof(int));//将p1的每一个字节都初始化为0
  5. int *p1 =new int;//未初始化
  6. int *p2 = new int();//初始化为0
  7. int *p3 = new int(2);//初始化为2
  8. int *p4 = new int[3];//数组元素为初始化
  9. int *p5 = new int[3]();//3个数组元素都初始化为0
  10. int *p6 = new int[3]{ };//3个数组元素都初始化为0
  11. int *p7 = new int[3]{ 2};//数组的首元素初始化为2,其他元素初始化为0

补充:将比较大的数据结构(对象,数组等)内存清零比较快的办法就是使用memset函数

创建的对象的内存可以存放在那些地方呢?
1、全局区(数据段):全局变量
2、栈区:函数里的局部变量
3、堆区:需要动态申请内存(malloc、new等)

  1. Person g_person;//全局区
  2. int main() {
  3. Person person;//栈区
  4. Person * p = new person;//堆区
  5. return 0;
  6. }

补充:new 和 delete 的基本用法
1、说明:new 和 delete 不是函数,而是一种运算符(strlen 和 sizeof 也是哦)
2、new 操作符可以分配一块存储空间并且指定这段空间存放的数据类型,还可以根据给定的参数列表对这段空间进行初始化(上面代码中有体现)
3、一段连续空间(数组)的申请与释放:

  1. int *p= new[10];//分配10个整型数据的内存空间
  2. delete[] p;//释放

对于初始化的问题还会在后面的构造函数里讲到,这里就不再阐述了

发表评论

表情:
评论列表 (有 0 条评论,87人围观)

还没有评论,来说两句吧...

相关阅读