首页 > 编程语言 >深入理解C++的new和delete

深入理解C++的new和delete

时间:2022-09-18 19:02:21浏览次数:108  
标签:malloc 20 int 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 }
用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

标签:malloc,20,int,C++,内存,new,开辟,delete
From: https://www.cnblogs.com/algorithm-code/p/new-delete.html

相关文章

  • C++ Unicode字符串
    字符串前面加L表示该字符串是Unicode字符串。_T是一个宏,如果项目使用了Unicode字符集(定义了UNICODE宏),则自动在字符串前面加上L,否则字符串不变。因此,VisualC++里边定义字符......
  • 《C++ Primer Plus 学习笔记》目录
    本篇为随笔《C++PrimerPlus学习笔记》的目录第1章预备知识第2章开始学习C++第3章处理数据第4章复合类型第5章循环和表达式第6章分支语句和逻辑运算符第7章......
  • 《C++ 基础知识杂记》目录
    本篇为随笔《C++基础知识杂记》的目录A篇C++指针A.1C++指针与一维数组名A.2C++指针与二维数组名A.3C++一级指针与const关键字A.4C++二级指针与const关......
  • 实践考核c++
    /*people是基类,student和graduate是子类,重载“==”运算符输入2个学生的信息:姓名、编号、身份证号、班级、专业输入1个研究生的信息:姓名、编号、身份证号、班级、专业、导......
  • c++基础入门自学笔记总结2---C++入门(下)
    今天,我们就来进行指针的知识总结。说句题外话,这部分可以说是c和c++重要基础,在初次接触时也感觉有点难度,即使在学后几天了对指针的运用还不是很熟练,但也不必太着急,毕竟学东......
  • 轻量级C++编程环境|快速搭建|Linux篇
    环境组成成分VisualStudioCode(编辑器)g++gdb(编译器与调试器)CMake(项目管理编译工具)安装VSCode拓展c++/c++extensioncmaketool以上请认准微软官方出品创建工程目......
  • 配置绿色免安装版的C/C++、java、python环境,重装系统可以继续使用
    windows系统用一段时间就会变得臃肿,我平均每年都会重装一下系统,因此需要配置免安装的环境,重装系统可以继续使用。 1、C/C++环境安装配置主流都是用minGwin的gcc/g++,最......
  • cypress 执行启动npm一直停在"fetchMetadata: sill resolveWithNewModule"的问题
    查看cypress的缓存位置PSD:\ema_cypress>npxcypresscachepathC:\Users\antony\AppData\Local\Cypress\Cachenode运行js文件时报错node01.js直接找到C:\Users\an......
  • C++学习笔记-day16
    1、模板......
  • 用C++ 编写QML 扩展
    用C++编写QML扩展Qt,QML,QtQuick这是关于用C++来扩展QML的教程。源文:WritingQMLExtensionswithC++QtQML模块提供了一系列API以实现通过C++来扩展QML。可以编写扩......