当前位置: 首页 > news >正文

new和delete

sizeof 类似,new 和 delete 也不是函数,它们都是 C++ 定义的关键字,通过特定的语法可以组成表达式。

sizeof 不同的是,sizeof 在编译时候就可以确定其返回值,new 和 delete 背后的机制则比较复杂。

在实例解释 new 背后的机制之前,你需要知道 operator new 和 operator delete 是什么。

operator new operator delete

这两个其实是 C++ 语言标准库的库函数,原型分别如下:

void *operator new(size_t);     //allocate an object

void *operator delete(void *);    //free an object

void *operator new[](size_t);     //allocate an array

void *operator delete[](void *);    //free an array

后面的两个先不看,注意:上面的两个不是重载,只是函数名叫这个,operator new 申请内存之后不对内存进行初始化,直接返回申请内存的指针。

new delete 背后机制

 

class A *pA = new A(10);

new:

  1. 首先需要调用上面提到的 operator new 标准库函数,传入的参数为 class A 的大小,这里为 8 个字节,至于为什么是 8 个字节,也是未类型化的,
  2. 第二步就在这一块原始的内存上对类对象进行初始化,调用的是相应的构造函数,这里是调用 A:A(10); 这个函数,从图中也可以看到对这块申请的内存进行了初始化,var=10, file 指向打开的文件。
  3. 最后一步就是返回新分配并构造好的对象的指针,这里 pA 就指向 0x007da290 这块内存,pA 的类型为类 A 对象的指针。

delete:

  1. 调用 pA 指向对象的析构函数,对打开的文件进行关闭。
  2. 通过上面提到的标准库函数 operator delete 来释放该对象的内存,传入函数的参数为 pA 的值,也就是 0x007d290。

如何申请和释放一个数组?new[] delete[]

C++ 的做法是在分配数组空间时多分配了 4 个字节的大小,专门保存数组的大小,在 delete [] 时就可以取出这个保存的数,就知道了需要调用析构函数多少次了。

例如:class A *pAa = new A[3];

  delete []pAa;

这里要注意的两点是:

  • 调用析构函数的次数是从数组对象指针前面的 4 个字节中取出;
  • 传入 operator delete[] 函数的参数不是数组对象的指针 pAa,而是 pAa 的值减 4。

为什么 new/delete new []/delete[] 要配对使用?

??使用 new [] 用 delete 来释放对象的提前是:对象的类型是内置类型或者是无自定义的析构函数的类类型!

new/deletenew[]/delete[] 要配套使用总是没错的!

转载于:https://www.cnblogs.com/Lune-Qiu/p/9331041.html

相关文章:

  • 论文笔记系列-Neural Architecture Search With Reinforcement Learning
  • Linux iptables命令
  • Dubbo2.7源码分析-Dubbo是如何整合spring-framework的
  • Mozilla推出兼容iOS的Face ID密码管理器Firefox Lockbox
  • Shareinstall——精确监测与推广APP的完美神器!
  • OpenJ_Bailian 7617 输出前k大的数
  • Session的save()、update()、merge()、lock()、saveOrUpdate()和persist()方法分别是做什么的?有什么区别?...
  • CSS选取第几个标签元素:nth-child、first-child、last-child
  • Kotlin 1.3 新特性抢先看,协程已稳定并将向后兼容
  • 第一章 Java多线程技能
  • Visual Studio 2017 设置透明背景图
  • 实现rsync远程同步效果展示
  • 因为阿里,他们成了“杭漂”
  • 基于web的全景—— Pannellum小试
  • vlan
  • Intervention/image 图片处理扩展包的安装和使用
  • js数组之filter
  • LeetCode18.四数之和 JavaScript
  • Python_OOP
  • spring security oauth2 password授权模式
  • 阿里云爬虫风险管理产品商业化,为云端流量保驾护航
  • 第13期 DApp 榜单 :来,吃我这波安利
  • 基于Mobx的多页面小程序的全局共享状态管理实践
  • 基于Volley网络库实现加载多种网络图片(包括GIF动态图片、圆形图片、普通图片)...
  • 将 Measurements 和 Units 应用到物理学
  • 码农张的Bug人生 - 初来乍到
  • 那些被忽略的 JavaScript 数组方法细节
  • 由插件封装引出的一丢丢思考
  • shell使用lftp连接ftp和sftp,并可以指定私钥
  • !!【OpenCV学习】计算两幅图像的重叠区域
  • #宝哥教你#查看jquery绑定的事件函数
  • (android 地图实战开发)3 在地图上显示当前位置和自定义银行位置
  • (Matalb时序预测)PSO-BP粒子群算法优化BP神经网络的多维时序回归预测
  • (Redis使用系列) Springboot 整合Redisson 实现分布式锁 七
  • (附源码)基于ssm的模具配件账单管理系统 毕业设计 081848
  • (附源码)小程序儿童艺术培训机构教育管理小程序 毕业设计 201740
  • (九十四)函数和二维数组
  • (一)python发送HTTP 请求的两种方式(get和post )
  • (一)基于IDEA的JAVA基础12
  • .chm格式文件如何阅读
  • .describe() python_Python-Win32com-Excel
  • .NET Entity FrameWork 总结 ,在项目中用处个人感觉不大。适合初级用用,不涉及到与数据库通信。
  • .NetCore部署微服务(二)
  • .net项目IIS、VS 附加进程调试
  • @Import注解详解
  • [ vulhub漏洞复现篇 ] JBOSS AS 4.x以下反序列化远程代码执行漏洞CVE-2017-7504
  • [ 隧道技术 ] 反弹shell的集中常见方式(四)python反弹shell
  • [20181219]script使用小技巧.txt
  • [2023-年度总结]凡是过往,皆为序章
  • [Asp.net mvc]国际化
  • [AutoSar]BSW_OS 01 priority ceiling protocol(PCP)
  • [CSS]文字旁边的竖线以及布局知识
  • [ERROR ImagePull]: failed to pull image k8s.gcr.io/kube-controller-manager失败
  • [Fri 26 Jun 2015 ~ Thu 2 Jul 2015] Deep Learning in arxiv
  • [hdu 4552] 怪盗基德的挑战书