一、C++中的动态内存管理方式
C语言中的动态管理方式是用malloc、free函数,它们在C++仍然可以继续使用,但是由于在部分地方略显无能为力,且使用起来比较麻烦,所以C++提出了自己的内存管理方式:采用new、delete关键字去进行动态内存管理。
注意:C语言开辟空间所用的malloc、calloc、free等,这些都属于函数,但是C++所使用的new和delete是关键字(或者说是运算符),这一点是本质上的区别。
二、new和malloc的区别
① malloc是按字节开辟内存,返回值类型是void*,需要对返回值类型进行强转,只管开辟内存,不进行初始化。初始化操作需要额外书写。
而new在堆中开辟内存时不仅可以指定其类型,还可以进行内存初始化的操作。
② malloc内存开辟是否成功是通过返回值与空指针nullptr去比较;
而new开辟内存是否成功,是通过是否抛出bad_alloc类型的异常来判断的。
当new申请内存失败时,会抛出bad_alloc异常,那么我们该如何去捕获异常、如何去处理呢?
这里有篇文章可供参考:https://blog.csdn.net/qq_39846523/article/details/108681889
1 #include<iostream>
2
3 using namespace std;
4
5 int main()
6 {
7 // malloc开辟int类型变量的内存空间
8 int *p = (int*)malloc(sizeof(int));
9 if(p == nullptr)
10 {
11 return -1;
12 }
13 *p = 20;
14 free(p);
15
16 // new开辟int类型变量的内存空间
17 int *p1 = new int (20); // int *p1 = new int (); 和 int *p1 = new int; 表示*p1初始值为0
18 delete p1;
19
20 /**********************************************************/
21
22 // malloc开辟int类型数组的内存空间
23 int *q = (int*)malloc(sizeof(int) * 20);
24 if(q == nullptr)
25 {
26 return -1;
27 }
28 free(q);
29
30 // new开辟int类型数组的内存空间
31 int *q1 = new int[20](); // 20个 int sizeof(int) * 20
32 // int *q1 = new int[20]; 表示将数值全部初始化为0
33 delete [] q1; // 注意这里[]放在q1前面!!!
34
35 return 0;
36 }
用malloc和new开辟了单个变量和数组的内存空间的例子
三、new有多少种?(面试题)
① 抛出异常的new
int *p1 = new int (20);
② 不抛出异常的new
int *p2 = new (nothrow) int;
③ 在堆上生成常量对象or变量的new
const int *p3 = new const int (40); // 常量要用常量指针去指
④ 定位new(在一块已经定位好的内存上,划分一个指定类型的空间,并可以填上初始值。)
int data = 0;
int *p4 = new (&data) int (50);
cout << data; // 最后输出结果是50
原文链接: https://www.cnblogs.com/algorithm-code/p/new-delete.html
欢迎关注
微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍
原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/5618
非原创文章文中已经注明原地址,如有侵权,联系删除
关注公众号【高性能架构探索】,第一时间获取最新文章
转载文章受原作者版权保护。转载请注明原作者出处!