目录
一、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型,并初始化为10 int* a1 = new int(10); //动态申请一个int型数组 int* arr1 = new int[10]; //动态申请一个int型数组,并初始化 int* arr2 = new int[3] {1, 2, 3}; //若为完全初始化,则后面的值会默认初始化为0 int* arr3 = new int[10] {1, 2, 3}; //每new一个变量,用完后一定要delete delete 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申请失败会抛异常;