内存空间的布局(栈区、堆区、代码区、全局区)以及堆空间的初始化
代码区(代码段):用于存放代码
全局区(数据段):用于存放全局变量等
栈区:当调用一个函数时,系统就会给他分配一段连续的栈空间,等函数调用 完毕后就会自动回收这段栈空间
堆区:需要主动的去申请和释放
为什么要引入堆区呢?
在程序运行过程中,为了能够自由地控制内存的生命周期、大小,会经常使用堆空间的内存。当我们需要的时候就可以向堆区申请,但是需要手动释放
下面重点讲讲堆区
堆空间的申请和释放:
malloc / free、new / delete、new [ ] / delete [ ]
注意:
1、申请堆空间成功后会返回一段内存地址的空间
2、申请和释放必须是一对一的关系,不然会造成内存泄露
3、new 和 malloc 区别:通过new分配的对象会自动调用构造函数和析构函数(构造函数、析构函数会在后面讲解)
4、申请成功的堆空间的地址是保存在指针中的,一般来说该指针变量是保存在栈区的(误区:不是所有的指针都保存在栈区的)
堆空间的初始化
//堆空间初始化
int *p = (int *)malloc(sizeof(int));//*p未初始化
int *p1 = (int *)malloc(sizeof(int));
memset(p1,0,sizeof(int));//将p1的每一个字节都初始化为0
int *p1 =new int;//未初始化
int *p2 = new int();//初始化为0
int *p3 = new int(2);//初始化为2
int *p4 = new int[3];//数组元素为初始化
int *p5 = new int[3]();//3个数组元素都初始化为0
int *p6 = new int[3]{ };//3个数组元素都初始化为0
int *p7 = new int[3]{ 2};//数组的首元素初始化为2,其他元素初始化为0
补充:将比较大的数据结构(对象,数组等)内存清零比较快的办法就是使用memset函数
创建的对象的内存可以存放在那些地方呢?
1、全局区(数据段):全局变量
2、栈区:函数里的局部变量
3、堆区:需要动态申请内存(malloc、new等)
Person g_person;//全局区
int main() {
Person person;//栈区
Person * p = new person;//堆区
return 0;
}
补充:new 和 delete 的基本用法
1、说明:new 和 delete 不是函数,而是一种运算符(strlen 和 sizeof 也是哦)
2、new 操作符可以分配一块存储空间并且指定这段空间存放的数据类型,还可以根据给定的参数列表对这段空间进行初始化(上面代码中有体现)
3、一段连续空间(数组)的申请与释放:
int *p= new[10];//分配10个整型数据的内存空间
delete[] p;//释放
对于初始化的问题还会在后面的构造函数里讲到,这里就不再阐述了
还没有评论,来说两句吧...