深入理解C++的new和delete

深入理解C++的new和delete

一、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 }
hmoban主题是根据ripro二开的主题,极致后台体验,无插件,集成会员系统
自学咖网 » 深入理解C++的new和delete