C++ 中 new 和 delete 详解,以及与 C 中 malloc 和 free 的区别
1. C++ 中 new
和 delete
的基本用法
在 C++ 中,new
和 delete
是用来动态分配和释放内存的关键字,它们是面向对象的替代方式,提供了比 C 语言更优雅的内存管理工具。
1.1 new
的使用
new
用于从堆中分配内存,并且自动调用对象的构造函数来初始化分配的内存。int* p = new int; // 分配一个整数 int* arr = new int[5]; // 分配一个整数数组class MyClass { public:MyClass() { /* 构造函数 */ } };MyClass* obj = new MyClass(); // 分配一个 MyClass 对象并调用构造函数
1.2 delete
的使用
delete
用于释放由new
分配的内存,并调用对象的析构函数来进行清理工作。delete p; // 释放单个整数的内存 delete[] arr; // 释放数组内存delete obj; // 释放 MyClass 对象的内存并调用析构函数
delete
和delete[]
是不同的操作符,delete[]
主要用于释放数组的内存
2. C 语言中的 malloc
和 free
的基本用法
2.1 malloc
的使用malloc - C++ Reference (cplusplus.com)
malloc
函数用于从堆中分配一块连续的内存,返回指向这块内存的指针。int* p = (int*)malloc(sizeof(int)); // 分配一个整数大小的内存 int* arr = (int*)malloc(5 * sizeof(int)); // 分配一个大小为5的整数数组
2.2 free
的使用free - C++ Reference (cplusplus.com)
free
函数用于释放由malloc
分配的内存。free(p); // 释放单个整数内存 free(arr); // 释放数组内存
需要注意的是,
malloc
只分配内存,不会初始化内存中的内容,free
也不会执行析构函数之类的清理工作。
3. new/delete 和 malloc/free 的区别
3.1 语法与功能上的区别
-
new/delete
是运算符,而malloc/free
是函数。 -
new
会调用类的构造函数,delete
会调用析构函数 -
malloc
和free
仅仅分配和释放内存,不涉及对象初始化和清理。
3.2 类型安全
new
不需要显式类型转换,因为它返回正确的类型指针。
malloc
返回void*
,因此需要进行显式类型转换。// C++ 使用 new,类型转换是隐式的 int* p = new int;// C 使用 malloc,需要显式转换 int* p = (int*)malloc(sizeof(int));
3.3⚠️⚠️⚠️内存分配失败的处理方式
-
new
在内存分配失败时会抛出异常,可以捕获进行错误处理。 -
malloc
在分配失败时返回NULL
,需要检查返回值来判断是否成功。 -
try {int* p = new int[10000000000]; // 分配内存失败会抛出异常 } catch (std::bad_alloc& e) {std::cerr << "Memory allocation failed: " << e.what() << std::endl; }int* p = (int*)malloc(10000000000 * sizeof(int)); if (p == NULL) {printf("Memory allocation failed\n"); }
4,两种代码对比直接下拉
🌟🌟🌟 整数🌟🌟🌟
使用
new/delete
:int* p = new int(42); // 分配一个整数并初始化为42 std::cout << *p << std::endl; // 输出:42 delete p; // 释放内存
使用
malloc/free
:int* p = (int*)malloc(sizeof(int)); *p = 42; // 初始化内存 printf("%d\n", *p); // 输出:42 free(p); // 释放内存
🌟🌟🌟数组 🌟🌟🌟
使用
new/delete[]
:int* arr = new int[5] {1, 2, 3, 4, 5}; for (int i = 0; i < 5; ++i) {std::cout << arr[i] << " "; // 输出:1 2 3 4 5 } delete[] arr; // 释放数组内存
使用
malloc/free
:int* arr = (int*)malloc(5 * sizeof(int)); for (int i = 0; i < 5; ++i) {arr[i] = i + 1;printf("%d ", arr[i]); // 输出:1 2 3 4 5 } free(arr); // 释放数组内存
复盘🐂
-
new/delete
是 C++ 专有的动态内存管理工具,它们不仅分配和释放内存,还会调用构造函数和析构函数,适合用于面向对象编程。 -
malloc/free
是 C 语言中的动态内存管理函数,它们只负责分配和释放内存,不会进行对象的初始化和清理。 -
new
具有类型安全性,而malloc
需要显式类型转换。 -
在内存分配失败时,
new
抛出异常,而malloc
返回NULL
。
共勉 💪
同为未来的it人让我们在共同进步吧。
我很喜欢雷军的一段话:我们就悄悄的干,就算失败了咱也不丢人。
相关文章:

C++ 中 new 和 delete 详解,以及与 C 中 malloc 和 free 的区别
1. C 中 new 和 delete 的基本用法 在 C 中,new 和 delete 是用来动态分配和释放内存的关键字,它们是面向对象的替代方式,提供了比 C 语言更优雅的内存管理工具。 1.1 new 的使用 new 用于从堆中分配内存,并且自动调用对象的构造…...

YOLOv11来了 | 自定义目标检测
概述 YOLO11 在 2024 年 9 月 27 日的 YOLO Vision 2024 活动中宣布:https://www.youtube.com/watch?vrfI5vOo3-_A。 YOLO11 是 Ultralytics YOLO 系列的最新版本,结合了尖端的准确性、速度和效率,用于目标检测、分割、分类、定向边界框和…...

Vue3 集成Monaco Editor编辑器
Vue3 集成Monaco Editor编辑器 1. 安装依赖2. 使用3. 效果 Monaco Editor (官方链接 https://microsoft.github.io/monaco-editor/)是一个由微软开发的功能强大的在线代码编辑器,被广泛应用于各种 Web 开发场景中。以下是对 Monaco Editor 的…...

一文详解Mysql索引
背景 索引是存储引擎用于快速找到一条记录的数据结构。索引对良好的性能非常关键。尤其是当表中的数据量越来越大时,索引对性能的影响愈发重要。接下来,就来详细探索一下索引。 索引是什么 索引(Index)是帮助数据库高效获取数据的…...

基于JAVA+SpringBoot+Vue的旅游管理系统
基于JAVASpringBootVue的旅游管理系统 前言 ✌全网粉丝20W,csdn特邀作者、博客专家、CSDN[新星计划]导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末附源码下载链接🍅 哈喽兄…...

STM32_实验3_控制RGB灯
HAL_Delay 是 STM32 HAL 库中的一个函数,用于在程序中产生一个指定时间的延迟。这个函数是基于系统滴答定时器(SysTick)来实现的,因此可以实现毫秒级的延迟。 void HAL_Delay(uint32_t Delay); 配置引脚: 点击 1 到 IO…...

RISC-V笔记——Pipeline依赖
1. 前言 RISC-V的RVWMO模型主要包含了preserved program order、load value axiom、atomicity axiom、progress axiom和I/O Ordering。今天主要记录下preserved program order(保留程序顺序)中的Pipeline Dependencies(Pipeline依赖)。 2. Pipeline依赖 Pipeline依赖指的是&a…...

构建后端为etcd的CoreDNS的容器集群(六)、编写自动维护域名记录的代码脚本
本文为系列测试文章,拟基于自签名证书认证的etcd容器来构建coredns域名解析系统。 一、前置文章 构建后端为etcd的CoreDNS的容器集群(一)、生成自签名证书 构建后端为etcd的CoreDNS的容器集群(二)、下载最新的etcd容…...

Leetcode 剑指 Offer II 098.不同路径
题目难度: 中等 原题链接 今天继续更新 Leetcode 的剑指 Offer(专项突击版)系列, 大家在公众号 算法精选 里回复 剑指offer2 就能看到该系列当前连载的所有文章了, 记得关注哦~ 题目描述 一个机器人位于一个 m x n 网格的左上角 (起始点在下…...

LabVIEW智能螺杆空压机测试系统
基于LabVIEW软件开发的螺杆空压机测试系统利用虚拟仪器技术进行空压机的性能测试和监控。系统能够实现对螺杆空压机关键性能参数如压力、温度、流量、转速及功率的实时采集与分析,有效提高测试效率与准确性,同时减少人工操作,提升安全性。 项…...

在 Ubuntu 22.04 上安装 PHP 8.2
在 Ubuntu 22.04 上安装 PHP 8.2,可以按照以下步骤进行: 更新系统软件包: 首先,确保你的系统软件包是最新的。 sudo apt update sudo apt upgrade 安装 PHP PPA(Personal Package Archive): U…...

Java生死簿管理小系统(简单实现)
学习总结 1、掌握 JAVA入门到进阶知识(持续写作中……) 2、学会Oracle数据库入门到入土用法(创作中……) 3、手把手教你开发炫酷的vbs脚本制作(完善中……) 4、牛逼哄哄的 IDEA编程利器技巧(编写中……) 5、面经吐血整理的 面试技…...

【VoceChat】一个即时聊天(IM)软件,又是一个可以嵌入任何网页聊天系统
为什么要搭建私人聊天软件 在当今数字化时代,聊天软件已经成为人们日常沟通和协作的重要工具。市面上的公共聊天平台虽然方便,但也伴随着诸多隐私、安全、广告和功能限制的问题。对于那些注重数据安全、追求高效沟通的个人或团队来说,搭建一…...

【LeetCode】动态规划—96. 不同的二叉搜索树(附完整Python/C++代码)
动态规划—96. 不同的二叉搜索树 题目描述前言基本思路1. 问题定义2. 理解问题和递推关系二叉搜索树的性质:核心思路:状态定义:状态转移方程:边界条件: 3. 解决方法动态规划方法:伪代码: 4. 进一…...

Nginx UI 一个可以管理Nginx的图形化界面工具
Nginx UI 是一个基于 Web 的图形界面管理工具,支持对 Nginx 的各项配置和状态进行直观的操作和监控。 Nginx UI 的功能非常丰富: 在线查看服务器 CPU、内存、系统负载、磁盘使用率等指标 在线 ChatGPT 助理 一键申请和自动续签 Let’s encrypt 证书 在…...

Vue向上滚动加载数据时防止内容闪动
目前的需求:当前组件向上滚动加载数据,dom加载完后,页面的元素位置不能发生变化 遇到的问题:加载完数据后,又把滚轮滚到之前记录的位置时,内容发生闪动 现在的方案: 加载数据之前记录整体滚动条…...

基于QT、ARM的智能停车管理系统+高分项目+源码
Parking-management-system 本系统基于QT、ARM开发板、Linux系统并对接百度AI 1.1 项目目的: 创建一个智能停车管理系统,能够停入车辆和取出车辆以及查询车辆停入停车场的状态并且计算车辆离开时收费情况。 1.2 项目意义: 实现停车场智能抬杆和智能收费系统&…...

1.6,unity动画Animator屏蔽某个部位,动画组合
动画组合 一边跑一边攻击 using System.Collections; using System.Collections.Generic; using UnityEngine;public class One : MonoBehaviour {private Animator anim;// Start is called before the first frame updatevoid Start(){anim GetComponent<Animator>();…...

发动机冷却系统排空气
发动机冷却系统排空气的几种常见方法 发动机冷却系统是汽车发动机的重要组成部分,它的主要作用是通过循环冷却液来吸收和散发发动机产生的热量,确保发动机在正常工作温度下运行。然而,在冷却系统的运行过程中,由于各种原因&#…...

三周精通FastAPI:1 第一步入门
FastAPI是一个非常棒的python web和api框架,准备用三周的时间“精通它” 学习流程参考FastAPI官网的用户教程:教程 - 用户指南 - FastAPI 学前提示 运行代码 所有代码片段都可以复制后直接使用(它们实际上是经过测试的 Python 文件&#x…...

RestTemplate基本使用之HTTP实现GET请求和POST请求
一、GET请求实例 public static TianQi getTianQi(String city) {RestTemplate restTemplate new RestTemplate();HashMap res restTemplate.getForObject("http://www.tianqiapi.com/api/?versionv6&appid15118158&appsecretgVNnwva8&city" city, H…...

2024-10-18 问AI: [AI面试题] 神经网络有哪些不同类型?
文心一言 神经网络有多种不同类型,每种类型都有其特定的结构和应用场景。以下是一些主要的神经网络类型: 前馈神经网络(FNN): 也称为全连接神经网络或感知器网络。由输入层、隐藏层和输出层组成,信息流是单…...

【开源免费】基于SpringBoot+Vue.JS课程作业管理系统(JAVA毕业设计)
本文项目编号 T 023 ,文末自助获取源码 \color{red}{T023,文末自助获取源码} T023,文末自助获取源码 目录 一、系统介绍二、演示录屏三、启动教程四、功能截图五、文案资料5.1 选题背景5.2 国内外研究现状5.3 可行性分析 六、核心代码6.1 查…...

jmeter中对于有中文内容的csv文件怎么保存
jmeter的功能很强大,但是细节处没把握好就得不到预期的结果。今天来讲讲有中文内容的csv文件的参数化使用中需要注意的事项。 对于有中文内容,涉及到编码格式,为了让jmeter能正确地读取csv文件中的中文,需要把文件转码为UTF-8BOM…...

Leetcode 921 Shortest Path in Binary Matrix
题意:求二维矩阵中往8个方向移动的话,从左上方到右下方移动的最短路径 https://leetcode.com/problems/shortest-path-in-binary-matrix/description/ 解答:bfs易得 class Solution { public:int shortestPathBinaryMatrix(vector<vecto…...

第二十二篇——菲欧几何:相对论的数学基础是什么?
目录 一、背景介绍二、思路&方案三、过程1.思维导图2.文章中经典的句子理解3.学习之后对于投资市场的理解4.通过这篇文章结合我知道的东西我能想到什么? 四、总结五、升华 一、背景介绍 对于几何的几个工具,让我再次感叹数学的伟大,逻辑…...

【AI整合包及教程】EchoMimic:开创数字人新时代,让静态图像“活”起来!
在数字化浪潮的推动下,人工智能技术正以前所未有的速度渗透到我们生活的方方面面。从智能家居到自动驾驶,从智能客服到医疗诊断,AI的触角无处不在。而如今,阿里巴巴旗下的蚂蚁集团再次引领潮流,宣布开源其革命性的数字…...

ArcGIS 最新底图服务地址
ArcGIS 最新底图服务地址 说明 先上地址: 地形图: https://services.arcgisonline.com/arcgis/rest/services/Elevation/World_Hillshade/MapServer深色地形图:https://services.arcgisonline.com/arcgis/rest/services/Elevation/World_Hi…...

【服务器部署】Docker部署小程序
一、下载Docker 安装之前,一定查看是否安装docker,如果有,卸载老版本 我是虚拟机装的Centos7,linux 3.10 内核,docker官方说至少3.8以上,建议3.10以上(ubuntu下要linux内核3.8以上,…...

三菱FX PLC设计一个电子钟程序实例
在这里介绍三菱FX系列PLC的计数器C的功能、结构,计数过程及工作原理。 功能: 对内部元件X、Y、M、S、T、C的信号进行计数。 结构: 线圈、触点、设定值寄存器、当前值寄存器。 地址编号: 字母C+(…...