C/C++内存管理(2):`new`和`delete`的实现原理

news2024/9/21 2:46:56

newdelete操作自定义类型

class Stack
{
public:
	Stack(int capacity = 3)
		:_top(0)
		, _capacity(capacity)
	{
		cout << "Stack(int capacity = 3)" << endl;
		_a = new int[capacity];
	}
    
	~Stack()
	{
		cout << "~Stack()" << endl;
		delete _a;
		_top = _capacity = 0;
	}
private:
	int* _a;
	int _top;
	int _capacity;
};

int main()
{
	Stack* s1 = new Stack;
	delete s1;

	return 0;
}

  • new:开对象空间+调用构造函数
  • delete:调用析构函数+释放对象空间

一、operator newoperator delete函数

1.1

operator newoperator delete是系统提供的全局函数new通过调用operator new申请空间,delete通过调用operator delete释放空间

int main()
{
    Stack* s1 = (Stack*)operator new(sizeof(Stack));
    operator delete(s1);
    
    return 0;
}

实际上,operator new通过malloc申请空间,operator delete通过free释放空间

二、newdelete实现原理

2.1 内置类型

申请内置类型空间时,new/deletemalloc/free基本类似。

new/delete申请和释放的是单个元素的空间,new[]/delete[]申请和释放的是连续空间。new申请失败会抛异常,malloc则返回NULL

2.2 自定义类型

T为某一种类

  • new T1. 调用operator new函数申请空间 2. 在已申请空间上调用构造函数,完成对象的构造。
  • delete1. 调用析构函数,完成对象资源清理 2. 调用operator delete 释放空间。
  • new T[N]1. 调用operator new[] 2.operator new[]过程中,实际调用operator new完成对 N 个对象空间的申请 3. 在申请的空间上执行 N 次构造
  • delete[]1. 在申请空间上完成 N 次析构 2. 调用operator delete[] 3. 实际调用operator delete释放空间

三、定位new表达式

3.1 概念

定位new表达式,指在已分配的内存空间上调用构造函数初始化对象

格式: new(地址)type(已有默认构造可以不传参)或 new(地址)type(初始化列表)

int main()
{
	Stack* s1 = (Stack*)operator new(sizeof(Stack));
	new(s1)Stack(2);// new(地址)type(初始化列表)

	delete s1;
	return 0;
}

四、总结malloc/freenew/delete的区别

共同点:

都是从堆上申请空间,且需要用户手动释放。

4.1 用法上
  1. malloc/free是函数,new/delete是操作符
  2. malloc申请的空间无法初始化,new可以初始化。
  3. malloc申请空间时需要手动计算大小并传递;new只需要+申请空间的类型即可,多个对象,在[]中指明个数。
  4. malloc的返回值类型是void*,需要强制转换,new不需要。
  5. malloc申请空间失败返回NULL,需要 ”判空 “;new需要捕获异常。
4.2 原理上
  1. 申请自定义类型空间时,malloc/free不会调用构造函数和析构函数;new/delete可以。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

I Doc View在线文档预览系统RCE漏洞(QVD-2023-45061)

0x01 产品简介 iDocView是一个在线文档解析应用&#xff0c;旨在提供便捷的文件查看和编辑服务。 0x02 漏洞概述 漏洞成因 本次漏洞出现在在线文档解析应用中的远程页面缓存功能。具体问题在于该应用未能对用户输入的URL进行充分的安全验证&#xff0c;从而导致存在安全隐患…

如何开发洗鞋店用的小程序

随着人们生活水平的提高&#xff0c;洗护行业是越来越细分化了&#xff0c;从最开始的干洗店包含洗护行业的所有服务到现在有专门为洗鞋开的店&#xff0c;如果开发一款洗鞋店用的小程序&#xff0c;可以实现用户在家下单直接有人上门取鞋的话&#xff0c;应该如何去开发呢&…

在数组的指定位置插入指定元素值numpy.insert()

【小白从小学Python、C、Java】 【计算机等级考试500强双证书】 【Python-数据分析】 在数组的指定位置插入指定元素值 numpy.insert() [太阳]选择题 请问以下代码中最后输出结果是&#xff1f; import numpy as np arr np.array([1, 2, 3]) print("【显示】arr ",…

tp8 使用rabbitMQ(2)工作队列

代码的参数说明在 第一小节的代码中&#xff0c;如果需要可移步到第一节中查看 工作队列 工作队列&#xff08;又称&#xff1a;任务队列——Task Queues&#xff09;是为了避免等待一些占用大量资源、时间的操作。当我们把任务&#xff08;Task&#xff09;当作消息发送到队列…

【nowcoder】BM2 链表内指定区间反转

题目 题目分析&#xff1a; # 代码实现&#xff1a; package BMP2;class ListNode {int val;ListNode next null;public ListNode(int val) {this.val val;} } public class BM2 {/*** 代码中的类名、方法名、参数名已经指定&#xff0c;请勿修改&#xff0c;直接返回方法…

一个最简单的工业通讯数据分析例子

1.背景 对工业设备的通讯协议进行分析可以帮助我们更好地理解其工作原理和相关技术&#xff0c;并且有助于以下几个方面&#xff1a; 1. 优化工业设备的通讯效率&#xff1a;了解通讯协议的细节可以帮助我们找到通讯效率低下的原因并进行优化&#xff0c;提高设备的通讯效率和…

重生之我是一名程序员 37 ——C语言中的栈溢出问题

哈喽啊大家晚上好&#xff01; 今天呢给大家带来一个烧脑的知识——C语言中的栈溢出问题。那什么是栈溢出呢&#xff1f;栈溢出指的是当程序在执行函数调用时&#xff0c;为了保护函数的局部变量和返回地址&#xff0c;将这些数据存储在栈中。如果函数在函数调用时使用了过多的…

Redis入门教程

1. 什么是NoSql NoSQL一词最早出现于1998年&#xff0c;是Carlo Strozzi开发的一个轻量、开源、不提供SQL功能的关系数据库。2009年&#xff0c;Last.fm的Johan Oskarsson发起了一次关于分布式开源数据库的讨论&#xff0c;来自Rackspace的Eric Evans再次提出了NoSQL的概念&am…

使用Python的turtle模块绘制钢铁侠图案

1.1引言&#xff1a; 在Python中&#xff0c;turtle模块是一个非常有趣且强大的工具&#xff0c;它允许我们以一个可视化和互动的方式学习编程。在本博客中&#xff0c;我们将使用turtle模块来绘制钢铁侠的图案。通过调用各种命令&#xff0c;我们可以引导turtle绘制出指定的图…

XDR 网络安全:技术和最佳实践

扩展检测和响应&#xff08;XDR&#xff09;是一种安全方法&#xff0c;它将多种保护工具集成到一个统一的集成解决方案中。它为组织提供了跨网络、端点、云工作负载和用户的广泛可见性&#xff0c;从而实现更快的威胁检测和响应。 XDR的目标是提高威胁检测的速度和准确性&…

tp8 使用rabbitMQ(1)简单队列

php8.0 使用 rabbitmq 要使用 3.6版本以上的&#xff0c; 并且还要开启 php.ini中的 socket 扩展 php think make:command SimpleMQProduce //创建一个生产者命令行 php think make:command SimpleMQConsumer //创建一个消费者命令行 代码中的消息持久化的说明 RabbitMQ 消息持…

通过云服务器部署JavaWeb项目

文章目录 搭建Java运行环境部署项目更改部分项目代码打包项目把war包上传到webapps目录下验证程序 搭建Java运行环境 搭建环境的部分比较复杂&#xff0c;为了让大家的思路更加清晰特别总结为一篇博客点击查看 部署项目 更改部分项目代码 打包项目 把war包上传到webapps目录…

web前端之若依框架图标对照表、node获取文件夹中的文件名,并通过数组返回文件名、在html文件中引入.svg文件、require、icon

MENU 前言效果图htmlJavaScripstylenode获取文件夹中的文件名 前言 需要把若依原有的icon的svg文件拿到哦&#xff01; 注意看生成svg的路径。 效果图 html <div id"idSvg" class"svg_box"></div>JavaScrip let listSvg [404, bug, build, …

机器人制作开源方案 | 智能图书搬运机器人

作者&#xff1a;张宸豪 戚益凡 陈世达 高梓钦 谭清 单位&#xff1a;华北科技学院 指导老师&#xff1a;罗建国 韩红利 阅读对于学生的重要性毋庸置疑&#xff0c;因此图书馆是一个校园非常重要的组成部分&#xff0c;图书馆的书籍借阅&#xff0c;能为学生提供非常大的…

链表的回文结构

题目描述 题目链接&#xff1a;链表的回文结构_牛客题霸_牛客网 (nowcoder.com) 题目分析 我们的思路是&#xff1a; 找到中间结点逆置后半段比对 我们可以简单画个图来表示一下&#xff1a; ‘ 奇数和偶数都是可以的 找中间结点 我们可以用快慢指针来找中&#xff1a;l…

电感热点温度概述及估算方法总结

🏡《电子元器件学习目录》 目录 1,什么是电感的热点温度2,热点温度参数意义3,热点温度计算方法3.1,测温估算法3.2,电阻变化估算法4,总结1,什么是电感的热点温度 电感的热点指电感的发热点,一般是电感的绕阻。电感的热点温度为电感绕阻的温度。 2,热点温度参数意义 电…

大洋钻探系列之三IODP 342航次是干什么的?(下)

上文简要地介绍IODP342航次的总体情况&#xff0c;本文以航次1个钻孔&#xff08;U1403&#xff09;为例&#xff0c;更为详细地系统展示大洋钻探航次的工作和成果。 ​编辑​ 站位叠加多波束影像的成果图见下图&#xff0c;从图中的颜色效果可以看出&#xff0c;此多波束的成…

15.Python 异常处理和程序调试

1. 异常处理 异常就是在程序执行过程中发生的超出预期的事件。一般情况下&#xff0c;当程序无法正常执行时&#xff0c;都会抛出异常。 在开发过程中&#xff0c;由于疏忽或考虑不周&#xff0c;出现的设计错误。因此&#xff0c;在后期程序调试中应该根据错误信息&#xff…

Redis集群环境各节点无法互相发现与Hash槽分配异常 CLUSTERDOWN Hash slot not served的解决方式

原创/朱季谦 在搭建Redis5.x版本的集群环境曾出现各节点无法互相发现与Hash槽分配异常 CLUSTERDOWN Hash slot not served的情况&#xff0c;故而把解决方式记录下来。 在以下三台虚拟机机器搭建Redis集群—— 192.168.200.160192.168.200.161192.168.200.162启动三台Redis集…