目录

一、简要描述两者的作用

二、实例解析

1. 浅层区别

2. 深层区别

三、拓展(operator new 的妙用)


一、简要描述两者的作用

new : 是c++推崇的 内存申请 方式,拥有比 malloc 更先进的机制

delete :是 对应的 内存释放方式,拥有比 free 更先进的机制

二、实例解析

1. 浅层区别

malloc 需要 计算实际需要的 字节数,而 new 则不需要

new 在申请基础类型内存块时,可以对 空间进行初始化 ,malloc 则不会

new 在内存申请失败后 会抛出异常, 而 malloc 则是返回NULL 需要对指针进行 NULL 检查

int main()
{int* arr = (int*)malloc(sizeof(int)*2);if (arr == NULL){cout << "检查后 -- malloc 失败" << endl;return 1;}elsecout << arr[0] << " " << arr[1] << endl;int* arr2 = new int[2] {1, 2};cout << arr2[0] << " " << arr2[1] << endl;return 0;
}

2. 深层区别

在对自定义类型(类,结构体等)进行内存申请时,malloc 同样只是申请对应 字节大小的空间,而 new 则会在申请后,去调用 自定义类型的 构造方法,对其进行初始化

同样 delete 在 释放 空间时 会去调用对应的 析构方法,实现对 类对象的 完全释放,避免成员指针指向空间没有被释放的 泄露问题。

class Test_new_delete
{
public:Test_new_delete(){_arrptr = new int[10] {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};cout << "new 主动调用构造方法 " << endl;}~Test_new_delete(){cout << "delete 主动调用析构方法 并对成员指针进行了释放防止内存泄漏 " << endl;delete[] _arrptr;}int* _arrptr;
};
int main()
{Test_new_delete* ptr0 = (Test_new_delete*)malloc(sizeof(ptr0));cout << "malloc 创建的ptr0 没有进行初始化 :" << ptr0->_arrptr << endl;free(ptr0);cout << "free 只是释放了的内存块,但是其中的指针所指向的空间并没有被释放,会造成内存泄露 " << endl;cout << endl << " ----------- " << endl << endl;Test_new_delete* ptr = new Test_new_delete;cout << "malloc 创建的ptr 通过调用构造方法进行初始化 :" << ptr->_arrptr << endl;delete ptr;return 0;
}

三、拓展(operator new 的妙用)

1. 在 调用 new  之后 ,new 内部会去调用 operator new  ,库中operator new 再去调用 malloc 进而进行内存申请,但是 operator new 中还会 在申请内存后进行 检查,如果malloc 内存申请失败 则会进行抛异常。

2. 用户可以在类中 对 operator new 进行重载,进而实现 指定类在调用 new 之后 ,去调用 自己实现 的 operator new ,而不调用 库函数,进一步实现 功能的自定义


class ST
{
public :void* operator new(size_t i){cout << "调用自己实现的 operator new" << endl;return (void*) 9;}
};
int main()
{void* ptr = new ST();cout << ptr << endl;return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/pingmian/96612.shtml
繁体地址,请注明出处:http://hk.pswp.cn/pingmian/96612.shtml
英文地址,请注明出处:http://en.pswp.cn/pingmian/96612.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

fMoE论文阅读笔记

原文链接&#xff1a;https://arxiv.org/pdf/2502.05370v1 在混合专家&#xff08;MoE&#xff09;架构中&#xff0c;初始阶段涉及输入样本通过GateNet进行多分类的鉴别过程&#xff0c;目的是确定最适合处理输入的专家模型。这个步骤被称为“experts selection”&#xff0c;…

Linux 禅道开源版安装

1、下载安装包安装wget https://www.zentao.net/dl/zentao/18.5/ZenTaoPMS.18.5.zbox_64.tar.gz tar zxf ZenTaoPMS.18.5.zbox_64.tar.gz/opt/zbox/zbox -ap 81 -mp 3307 # 指定apache服务端口 、 mysql服务端口 /opt/zbox/zbox start #启动禅道服务( 其他命令 /opt/zbox/…

PySpark基础知识(python)

PySpark 是 Apache Spark 的 Python API&#xff0c;它允许开发者使用 Python 语言编写 Spark 应用程序&#xff0c;结合了 Python 的易用性和 Spark 的分布式计算能力&#xff0c;是处理大规模数据的强大工具。 一、安装与环境配置 安装方式&#xff1a; 通过 pip 安装&#…

基于python大数据的电影数据分析可视化系统设计与应用

标题:基于python大数据的电影数据分析可视化系统设计与应用内容:1.摘要 本研究旨在设计并实现一个基于Python的大数据电影数据分析与可视化系统&#xff0c;以解决当前电影行业数据分散、分析效率低及可视化能力不足的问题。系统采用Python语言结合Pandas、NumPy进行数据清洗与…

【PyTorch】图像多分类

多类图像分类的目标是为一组固定类别中的图像分配标签。目录 加载和处理数据 搭建模型 定义损失函数 定义优化器 训练和迁移学习 用随机权重进行训练 用预训练权重进行训练 加载和处理数据 将使用 PyTorch torchvision 包中提供的 STL-10 数据集&#xff0c;数据集中有…

计算机视觉----opencv实战----指纹识别的案例

一、数据准备src2.BMPsrc1.BMPsrc.bmpmodel.BMP二、识别原理讲解&#xff08;sift特征提取&#xff09;SIFT&#xff08;Scale-Invariant Feature Transform&#xff0c;尺度不变特征变换&#xff09;是一种经典的图像特征提取算法&#xff0c;核心优势是不受图像尺度缩放、旋转…

npm 发布流程——从创建组件到发布到 npm 仓库

1. 准备组件 1.1 创建一个 Vue 组件 假设我们要创建一个简单的按钮组件&#xff1a; src/MyButton.vue <template><button class"my-btn" click"$emit(click)"><slot /></button> </template><script setup lang"ts…

MySQL入门基础指南

目录 一、什么是数据库&#xff1f; 仅依靠文件存储数据存在以下几个明显缺点&#xff1a; 数据库的存储介质通常包括&#xff1a; 二、主流数据库介绍 三、客户端 VS 服务器 四、推荐看的MySQL安装技术博客 五、数据库的存储介质 数据库的存储介质主要分为以下两类&am…

【实战中提升自己完结篇】分支篇之分支之无线、内网安全与QOS部署(完结)

1 1拓扑 「模拟器、工具合集」复制整段内容 链接&#xff1a;https://docs.qq.com/sheet/DV0xxTmFDRFVoY1dQ?tab7ulgil1 分支无线部署 说明&#xff1a;分支无线用瘦AP部署&#xff0c;通过VPN直接注册到总部的AC上面&#xff0c;实现无线的业务提供&…

带你了解STM32:GPIO通用输入输出口

目录 3.1 GPIO简介 3.2 GPIO基本结构 3.3 GPIO位结构 输入部分&#xff1a; 二极管的保护作用&#xff1a; 施密特触发器&#xff1a; 片上外设端口 输出部分&#xff1a; MOS管 3.4 GPIO模式 3.4.1 浮空/上拉/下拉输入 3.4.2 模拟输入 3.4.3 开漏/推挽输出 3.4.…

Http(自写)

作为一个程序员&#xff0c;假设我们要在a电脑的进程里发一段数据到b电脑&#xff0c;一般使用socket编程&#xff0c;可选项也就tcp&#xff0c;udp二选一socket本质上就是一个代码库tcp有粘包问题&#xff08;字节流&#xff09;&#xff0c;纯裸tcp不能之际拿来使用所以我们…

C#使用OpenVinoSharp和PP-Human进行行人检测

效果 项目依赖 OpenCvSharp 4.11.0.20250507 OpenVINO.CSharp.Windows 2024.0.0.1 主要代码 using OpenCvSharp; using OpenVinoSharp; using System; using System.Windows.Forms;namespace HelloPPHuman {public partial class Form1 : Form{public Form1(){InitializeCo…

四、Scala深入面向对象:类、对象与伴生关系

在前几节中&#xff0c;我们学习了 Scala 的基础语法和流程控制。现在&#xff0c;我们将深入探索 Scala 作为一门纯粹的面向对象语言的核心。在 Scala 中&#xff0c;万物皆对象&#xff0c;没有像 Java 那样的原始类型和静态成员的区分。本节将重点介绍如何定义对象的蓝图&am…

【大语言模型 58】分布式文件系统:训练数据高效存储

分布式文件系统&#xff1a;训练数据高效存储 关键词&#xff1a;分布式文件系统、HDFS、Lustre、GlusterFS、数据本地性、I/O优化、存储架构、大数据存储、训练数据管理、存储性能调优 摘要&#xff1a;本文深入探讨大语言模型训练中的分布式文件系统技术&#xff0c;从存储架…

【科研绘图系列】R语言绘制散点图以及线性回归拟合曲线图

禁止商业或二改转载,仅供自学使用,侵权必究,如需截取部分内容请后台联系作者! 文章目录 介绍 加载R包 数据下载 函数 导入数据 数据预处理 画图 总结 系统信息 介绍 数据导入 代码的开始部分涉及多个数据集的导入,这些数据集涵盖了不同类型的生态学数据,包括实验室培养…

SQL 数据库操作语言详解

1. SQL 语言概述SQL&#xff08;Structured Query Language&#xff09;是用于管理关系型数据库的标准语言&#xff0c;主要分为以下几个子语言&#xff1a;- DQL&#xff08;数据查询语言&#xff09;&#xff1a;SELECT - 用于数据查询 - DML&#xff08;数据操作语言&#x…

积分变换的前世今生

积分变换常应用于解微分方程微分方程的解法&#xff1a;时域经典法&#xff1b;频域变换法&#xff1b;“积分变换”最初并不是为了解微分方程&#xff0c;而是出于更“纯粹”的数学动机——理解函数的结构、求解代数或几何问题&#xff0c;以及简化复杂的积分运算。微分方程的…

《Linux——gflags》

一、什么是gflags&#xff1f; gflags 是一个由 Google 开发的命令行参数解析库&#xff0c;主要用于在 C&#xff08;也支持其他语言&#xff09;程序中便捷地处理命令行参数。它的核心作用是帮助开发者快速定义、解析和使用命令行选项&#xff0c;避免手动编写繁琐的参数解析…

编译器的前端中端和后端

前面说的词法分析和语法分析&#xff0c;确实是编译器前端 (Front End) 最核心的两个部分。但前端的工作还没有结束。编译器各阶段划分 一个完整的编译器通常可以分为三个部分&#xff1a;前端、中端 (Middle End)、后端 (Back End)。 前端 (Front End) 核心职责: 理解源代码。…

黑马Java进阶教程,全面剖析Java多线程编程,并发和并行,笔记02

黑马Java进阶教程&#xff0c;全面剖析Java多线程编程&#xff0c;并发和并行&#xff0c;笔记02 一、并发和并行 并发&#xff1a;在同一时刻&#xff0c;有多个指令在单个CPU上交替执行 并行&#xff1a;在同一时刻&#xff0c;有多个指令在多个CPU上同时执行 二、为什么有…