深入理解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_/article/details/
1 #include2 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 }
分享名称:深入理解C++的new和delete
分享地址:http://ybzwz.com/article/dsoiije.html