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…...
计算机毕业设计:Python智慧出行数据分析系统 Django框架 可视化 数据大屏 数据分析 大数据 机器学习 深度学习(建议收藏)✅
1、项目介绍 技术栈:Python语言、Django框架、ECharts可视化库、数据大屏技术。 功能模块: 首页模块数据大屏模块数据分析模块数据查看模块登录模块后台管理模块订单管理模块用户管理模块 项目介绍:滴滴出行数据分析平台基于Django框架开发&a…...
OpenClaw语音控制之GoogleAPI 集成实战教程
11.1 Google Cloud 账号设置 在使用 Google Cloud 的任何服务之前,首先需要拥有一个 Google Cloud 账号。本节将详细介绍账号注册、项目创建和支付方式绑定的完整流程。 步骤 1:访问 Google Cloud 控制台 打开浏览器,访问 Google Cloud 控制台地址:https://console.clou…...
DSP数字电源方案:C2000系列主控TMS32F28069 Buck-Boost双向变换器(...
DSP数字电源方案 Buck-Boost双向变换器 数字控制方式:C2000系列 主控TMS32F28069 300W,8A,输入10-75V,输出5-75V 双向升降压功率转换器buck-boost结构 提供主板PCB,原理图(AD格式),源代码,无控制板资料。 …...
RVC与So-VITS-SVC对比:轻量级vs高保真,选型决策指南
RVC与So-VITS-SVC对比:轻量级vs高保真,选型决策指南 想用AI给自己的声音换个风格,或者让喜欢的歌手“唱”一首新歌,却发现工具太多,不知道选哪个好?RVC和So-VITS-SVC是目前最火的两个开源语音转换模型&…...
3大优势!Scarab模组管理工具使用技巧:从新手到高手的进阶指南
3大优势!Scarab模组管理工具使用技巧:从新手到高手的进阶指南 【免费下载链接】Scarab An installer for Hollow Knight mods written in Avalonia. 项目地址: https://gitcode.com/gh_mirrors/sc/Scarab 你是否在安装空洞骑士模组时遇到过文件路…...
OpenMC蒙特卡洛模拟的技术突破:从算法创新到工程实践
OpenMC蒙特卡洛模拟的技术突破:从算法创新到工程实践 【免费下载链接】openmc OpenMC Monte Carlo Code 项目地址: https://gitcode.com/gh_mirrors/op/openmc 问题溯源:蒙特卡洛模拟的效率困境与技术挑战 在核工程、粒子物理和辐射防护等领域&a…...
DAMOYOLO-S模型Android端集成实战:移动端实时检测应用开发
DAMOYOLO-S模型Android端集成实战:移动端实时检测应用开发 如果你是一名Android开发者,想在自己的App里加入实时物体检测功能,比如识别摄像头里的猫猫狗狗、车辆行人,但又担心模型太大、速度太慢,那今天这个实战项目就…...
HTML函数开发需要多少瓦电源_整机功耗估算指南【说明】
最准方法是用电力功耗仪实测整机交流输入功率;鲁大师靠查表估算易失真;HTML开发真实耗电来自浏览器、框架、开发服务等;选电源须看12V输出能力和80 PLUS认证。怎么看当前整机真实功耗(不是TDP,是插座上真烧的电&#x…...
保姆级教程:在RK3588开发板上跑通librga图形加速demo(含预编译库避坑指南)
在RK3588开发板上快速验证librga图形加速功能的实战指南 对于刚接触RK3588开发板的嵌入式开发者来说,图形加速功能的验证往往是一个令人头疼的环节。Rockchip提供的librga库虽然功能强大,但官方GitHub仓库的编译步骤复杂,依赖众多࿰…...
Hunyuan-MT-7B在Keil5项目中的集成:嵌入式系统多语言界面
Hunyuan-MT-7B在Keil5项目中的集成:嵌入式系统多语言界面 1. 引言 你有没有遇到过这样的情况:开发了一款很棒的嵌入式产品,准备推向国际市场时,却发现多语言支持成了大问题?传统的解决方案要么需要为每种语言单独编译…...

