new delete用法它们与 malloc free 的区别

文章目录

  • new 和 delete的用法
    • operate new() operate delete()
  • new delete 和 malloc free的区别
  • new[] delete[] 的含义

new 和 delete的用法

基本写法,new也是先申请空间
这里的new和malloc用的地方一样但是new用起来代码简洁不少而且不需要强转和指定大小

int main()
{int* p = new int;int* p2 = (int*)malloc(sizeof(int));delete p;free(p2);
return 0;
}

但是new真正要解决的问题不在这种地方
我们来写一个类看看new在类中的发挥

class A
{
public:A(int c){_a = c;}private:
int _a;
};int main()
{
//我们申请了一块儿大小为A字节的空间但是麻烦的来了我们该如何初始化呢???
A* ptr = (A*)malloc(sizeof(A));
free(ptr);
//ptr->A????
//我们都知道构造函数是不可以被显式的调用(这里的处理方式我们后面可以学习定位new但是现在不予考虑)
return 0;
}

所以new处理的的第一个问题就是malooc无法初始化自定义类型的问题,但是new我们可以直接初始化也就是去调用其构造函数
在这里插入图片描述

class A
{
public:A(int c){_a = c;}private:
int _a;
};int main()
{//它会去调用该类的构造函数进行初始化A* ptr = new A;delete prt;//这里的delete就会自动调用该类的析构函数 然后再释放空间
return 0;
}

那么如果我们想给new出来的空间赋值或者开辟指定大小的空间呢??
给自定义类型进行赋值也就是调用自定义类型的构造函数进行传参等操作
在这里插入图片描述
对待内置类型进行初始化赋值也是直接进行小括号内部赋值
在这里插入图片描述

如何一次性开辟多个对象的空间呢?
对于内置类型我们认为
在这里插入图片描述

对于我们的自定义类型
在这里插入图片描述

operate new() operate delete()

ok知道了new 的基本用法我们来了解一下new的实现过程
new 和 delete 是两个操作符使用它们的时候会去调用两个全局函数一个是operate new() 一个是operate delete()这两个全局函数我们可以来看一看
通过汇编指令我们可以看见operate new[] 因为我们这里new 了多个对象所以调用的函数也是 operate new[] 但是它也没啥特别的
在这里插入图片描述
当我们进入到operate new[] 函数里面的时候我们就可以发现
在这里插入图片描述
所以重头戏是operate new ,它里面的实现过程是什么样的呢?
在这里插入图片描述
我们发现new 的实现就是通过malloc实现的,那么delete任然同理 delete就是通过free()来实现

new delete 和 malloc free的区别

他们一共有六点不同
1.new 和 delete 是操作符,malloc() 和 free() 是函数
2.new 和 delete 不需要自己手动算大小[X]即可 但是 malloc 需要自己算大小
3.new 可以对自定义类型进行主动初始化 malloc() 做不到
4.new 可以自动写明类型也就是跟的空间类型 malloc需要强制转换因为malloc的返回值是void*
5.new 如果申请空间失败了是捕获异常,malloc()则是返回NULL
6.new 会去调用 自定义类型的构造函数 malloc 不能,malloc只能申请空间
在这里插入图片描述

new[] delete[] 的含义

为什么我们delete的时候只需要写delete[]不需要给这个括号里写入大小呢??
在这里插入图片描述
这一切都是编译器帮我们做的
在这里插入图片描述
所以当我们new[] 完成的时候 我们delete[] 这个方括号不能掉了不然编译器识别不到,就会少释放四个字节的空间,那么就会造成内存的泄露这个危害我们以后也会讲

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

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

相关文章

“Linux”目录结构and配置网络

了解完命令格式和vi、vim编辑器后,我们来认识一下目录的结构: 一、目录 (1)目录的特点 windows特点: Windows中有C、D、E盘,每个都是一个根系统 Linux特点: linux中只有一个根(单…

研究变压器感应耐压试验电源的能效和节能潜力

变压器感应耐压试验电源 变压器感应耐压试验电源在电源行业中是一种非常重要的设备,用于测试和验证变压器的绝缘性能。变压器感应耐压试验电源是一种专门为变压器感应耐压试验而设计的电源设备。它的工作原理基于变压器的感应原理,利用感应电压来对变压器…

打开指定文件夹下的jupyter

cd到相应路径,输入jupyter notebook ./ 注意./ 非常重要,不然又进了默认文件夹

Pytorch深度学习入门--1.Tensor基础

一、Tensor Tensor,中文叫做张量,它是Pytorch中最基本的数据类型,同时也是最重要的数据类型 二、数学含义 在数学中,标量是只有大小没有方向的量。例如,1,2,3等。向量是既有大小又有方向的量。例如, &am…

【案例】使用Vue实现拖拽课表

效果展示 效果说明 点击左侧的课程并进行拖拽,拖拽到要开设本课程的地方然后松手,即可将本节课设置为当前所拖拽的科目并且背景色为当前科目的背景色,当多次拖拽到同一节课的时候将会实现后者覆盖前者的效果。 效果实现代码 第一步&#x…

Linux 通过关键字查找文件

按文件名查找 find 路径 -name “文件名” 查找当前目录下的所有mk文件 find . -name "*.mk"按关键字查找 find 路径 -name “文件名” | xargs grep -n “关键字” 参数: xargs 是给命令传递参数的一个过滤器,也是组合多个命令的一个工具 -n…

使用 Python 进行图像验证码识别训练及调用

目录 1、验证码识别原理1.1 Tensorflow 介绍1.2 Tensorflow 运行原理1.3 卷积神经网络 CNN(Convolutional Neural Networks) 2、验证码识别实现步骤2.1 安装第三方模块2.1.1 安装 TensorFlow 模块2.2.2 安装 cuda2.2.3 下载 cudnn 2.2 读取验证码样本形成…

重磅!麒麟信安发布CentOS安全加固套件

CentOS Linux 7系统即将在6月30日停服,标志CentOS全部停止更新和维护。党政、金融、能源、通信、交通、公共服务等关键信息基础设施领域已经投运使用的CentOS系统将无法获取官方提供的漏洞修复补丁,此后,CentOS系统将面临巨大的安全风险与危害…

【Kubenetes】微服务治理:服务网格Istio安装搭建体验

文章目录 ServiceMesh介绍Istio解决方案安装Istio第一步 下载istio第二步 安装istio环境第三部 安装istio应用第四部 暴露到外部流量然后再下一步 把dashboard弄好 ServiceMesh介绍 扯淡环节 什么是服务网格?–服务间通信,可扩展性和灵活性服务网格的工作原理 --…

GMV ES6直流变频多联空调机组室外机工作原理

GMV ES6直流变频多联空调机组室外机工作原理如下: 内机为制冷模式运行时,室外机根据室内机的运行负荷需求启动运行,室外换热器作为系统的冷凝器,各制冷室内机的换热器并联作为系统的蒸发器,通过室内机的送回风循环实现…

推荐网站(8)iconfinder图标网站,包含大量图标

今天推荐网站iconfinder,他是一个包含大量图标网站,你可以找到自己想要的图标在里面,各种图标任你选择。 比如搜索appple图标 链接直达:https://www.iconfinder.com

通义千问模型升级:2.5正式上线的使用体验

个人对比各AI大模型的使用体会 正在用的国内的AI大模型主要有“通义千问”、“文心一言”、“讯飞星火”,还有国外的"ChatGPT"和"Copilot",我觉得"通义千问"进步神速,因此现在我最常使用的就是"通义千问&…