目录
一、C/C++中程序的内存区域划分
为什么会存在内存区域划分?
二、new关键字
1、内置类型的new/delete使用方法:
2、new和delete的本质
一、C/C++中程序的内存区域划分
为什么会存在内存区域划分?
因为不同数据有不同的存储需求,各区域满足不同的需求。
例如:
(1)、一些临时变量,局部变量存储在栈区
(2)、常用数据结构或一些算法(如归并排序)中会用到动态内存开辟,该内存是在堆区申请。
(3)、全局变量、静态变量存储在数据段(静态区)。
(4)、一些只读数据,如字符常量、可执行代码(指令)存储在代码段(常量区)。
二、new关键字
C语言中动态内存管理方式使用malloc/calloc/realloc/free函数来实现,C语言内存管理方式在C++中可以继续使用,但有些地方就无能为力,而且使用起来比较麻烦,因此C++又提出了自己的内存管理方式:通过new和delete操作符进行动态内存管理。
1、内置类型的new/delete使用方法:
//动态申请一个int型int* a = new int;//动态申请一个int型,并初始化为10int* a1 = new int(10);//动态申请一个int型数组int* arr1 = new int[10];//动态申请一个int型数组,并初始化int* arr2 = new int[3] {1, 2, 3};//若为完全初始化,则后面的值会默认初始化为0int* arr3 = new int[10] {1, 2, 3};//每new一个变量,用完后一定要deletedelete a;delete a1;//注意数组的区别delete[] arr1;delete[] arr2;delete[] arr3;
注意:使用new未初始化时,不会有默认值,而是随机值。
2、new和delete的本质
new的本质是为了解决动态申请的自定义类型对象的初始化问题。
因为C语言中malloc函数不能给自定义类型进行初始化:
//malloc不能给自定义类型初始化A* p1 = (A*)malloc(sizeof(A));
所以这时就可以用new和delete:
(1)、new的本质:开空间+调用构造函数初始化;
(2)、delete的本质:先调用析构函数+释放空间。
如下:
//new给自定义类型初始化//调用默认构造函数A* p2 = new A();//调用带参数构造函数A* p3 = new A(1);//给对象数组初始化//(1)、有名对象A aa1, aa2, aa3;A* arr1 = new A[3]{ aa1,aa2,aa3 };//(2)、匿名对象A* arr2 = new A[3]{ A(),A(),A()};//(3)、隐式类型转换A* arr3 = new A[3]{ 1,2,3 };
注意:
(1)、内置类型的底下申请释放,new和malloc除了用法上,没有区别;
(2)、malloc申请失败会返回NULL,而new申请失败会抛异常;