【C++学习】C++的动态内存管理 | new和delete的底层 | 初识模板

news2024/11/14 23:30:59

目录

1. C++的动态内存管理

2. new和delete的底层

3. 定位new

4. new和malloc 的区别总结

5. 模板

写在最后:


1. C++的动态内存管理

上一篇文章已经大致介绍完new和delete的用法,

以及C++和C语言两种动态内存管理方式的区别,这里简单总结一下:

1. 动态申请内置类型的数据:

new/malloc除了用法上面,其他方面没什么区别。

2. 动态申请自定义类型的数据:

new/malloc除了用法上面,new/delete还会调用构造函数初识化和析构函数。

2. new和delete的底层

来看:

 

我们可以看到,new和delete实际上是调用这两个全局函数:

operator new 和 operator delete,而这两个库函数其实我们也可以直接使用

来看代码:

 

#include <iostream>
using namespace std;

int main()
{
	int* p1 = new int;
	delete p1;

	int* p2 = (int*)operator new(sizeof(int));
	operator delete(p2);

	return 0;
}

我们可以看到,从用法上来看,这两个函数的用法是和malloc和free是一样的,

我这里在来看:

new的malloc之间的区别,

new的功能:开空间 + 构造函数

malloc功能:开空间

实际上,new的底层开空间就是直接使用的malloc,但是

面向对象的语言处理失败,不喜欢用返回值,更建议用抛异常,而malloc失败返回的是空,

所以实际上operator new是对malloc的一个封装,如果申请失败,operator new就会抛异常,

所以new就是使用operator new开空间 + 调用构造函数。

3. 定位new

定位new的作用是显示调用构造函数,

在平时,构造函数都是自动调用的,在创建对象的时候自动调用,

在使用new的时候也会自动调用构造函数,

来看这段代码:

#include <iostream>
using namespace std;

class A {
public:
	A()
	{
		cout << "A()" << endl;
	}

	~A()
	{
		cout << "~A()" << endl;
	}
};

int main()
{
	A* p1 = new A;
	delete p1;

	//使用定位new模拟new的功能
	A* p2 = (A*)malloc(sizeof(A));
	new(p2)A; 

	p2->~A();
	free(p2);

	return 0;
}

输出:

A()
~A()
A()
~A()

定位new的用法就是这样:new(p2)A;new(指针)类型。

当然,如果需要传参也可以:new(p2)A(1),这样给构造函数传参。

4. new和malloc 的区别总结

malloc / free和new / delete的共同点是:

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

不同的地方是:

1. malloc和free是函数,new和delete是操作符

2. malloc申请的空间不会初始化,new可以初始化

3. malloc申请空间时,需要手动计算空间大小并传递,

new只需在其后跟上空间的类型即可,如果是多个对象,[]中指定对象个数即可

4. malloc的返回值为void*, 在使用时必须强转,new不需要,因为new后跟的是空间的类型

5. malloc申请空间失败时,返回的是NULL,

因此使用时必须判空,new不需要,但是new需要捕获异常

6. 申请自定义类型对象时,malloc / free只会开辟空间,不会调用构造函数与析构函数

而new在申请空间后会调用构造函数完成对象的初始化,

delete在释放空间前会调用析构函数完成空间中资源的清理。

总结:

前四个是特性和用法之间的不同,

后面两个是底层实现的不同:返回值/抛异常,调用构造和析构函数

5. 模板

模板是个好东西,

我先来看这样一段代码:

#include <iostream>
using namespace std;

void Swap(int& x, int& y) {
	int tmp = x;
	x = y;
	y = tmp;
}

void Swap(double& x, double& y) {
	double tmp = x;
	x = y;
	y = tmp;
}

void Swap(char& x, char& y) {
	char tmp = x;
	x = y;
	y = tmp;
}

int main()
{

	return 0;
}

我们在学了函数重载之后,可以通过这种方式,

让我们对这几个类型都能使用交换操作,但是,这样全部写一遍也太麻烦了,

这还只是三个类型,如果有更多的类型呢?

那该怎么办呢?

来看代码:

#include <iostream>
using namespace std;

//也可以这样写:template<class T>
template<typename T>
void Swap(T& x, T& y) {
	T tmp = x;
	x = y;
	y = tmp;
}

int main()
{
	int a1 = 10, b1 = 20;
	double a2 = 1.1, b2 = 2.2;
	char a3 = 'a', b3 = 'b';

	Swap(a1, b1);
	Swap(a2, b2);
	Swap(a3, b3);

	return 0;
}

使用了模板之后,就能支持所有类型的交换了,

模板的那个T就是模板参数,它定义的是类型。

这个时候又有一个问题了,那这三个Swap调用的是同一个函数吗?

我们来看看汇编怎么说:

 发现没有,三个函数的地址是不同的,他们是调用的是三个不一样的函数,

因为这个Swap只是一个模板,他会根据你的调用生成对应的函数,

而这个过程称之为模板的实例化。

就像这张图一样:

所以实际上我们调用的还是这些具体的函数,

 最终是编译器承担了这一切,承担了我们需要干的活。

写在最后:

以上就是本篇文章的内容了,感谢你的阅读。

如果感到有所收获的话可以给博主点一个哦。

如果文章内容有遗漏或者错误的地方欢迎私信博主或者在评论区指出~

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

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

相关文章

【MMCV python安装指南】

MMCV python安装指南 MMCV 介绍安装教程1.系统环境2.python版本3.torch版本4.mmcv版本 安装示例 MMCV 介绍 mmcv 是用于计算机视觉研究的基础 Python 库&#xff0c;支持 MMLAB 中的许多研究项目&#xff0c;例如 MMDetection https://github.com/open-mmlab/mmdetection MMAct…

arc163 C 思维构造

题意&#xff1a;https://atcoder.jp/contests/arc163/tasks/arc163_c 思路&#xff1a;本题构造主要就是围绕 初始放入2&#xff0c;3&#xff0c;6&#xff0c;然后一直将一个拆解直到满足大小。 /*keep on going and never give up*/ #include<cstdio> #include<…

【择校】肠子悔青,录取分数断层,超过第二名44分,超过最后一名146分!

一、学校及专业介绍 中南民族大学&#xff08;South-Central Minzu University&#xff09;坐落于湖北省武汉市&#xff0c;中华人民共和国国家民族事务委员会直属高校&#xff0c;位列湖北省“国内一流大学建设高校”、“少数民族高层次骨干人才计划”资格高校、全国深化创新创…

15. python从入门到精通——Pygame游戏编程

目录 游戏的原理 安装Pygame Pygame常用模块 Pygame的基本使用 实例:制作一个跳跃的小球游戏&#xff0c;如果碰到窗口边缘会改变小球移动方向 实现步骤&#xff1a; 运行效果&#xff1a; 小球图片&#xff1a; python代码&#xff1a; 开发Flappy Bird游戏 …

生成古风少女图片【InsCode Stable Diffusion美图活动一期】

作者简介&#xff1a;一名云计算网络运维人员、每天分享网络与运维的技术与干货。 座右铭&#xff1a;低头赶路&#xff0c;敬事如仪 个人主页&#xff1a;网络豆的主页​​​​​ 目录 写在前面 Stable Diffusion 模型在线使用地址&#xff1a; 工具介绍 一.如何使用S…

基于Java的酒店管理系统设计与实现(源码+文档+报告+任务书)

本系统采用Java语言进行开发&#xff0c;实现了跨平台的部署。使用了MySQL数据库进行数据存储&#xff0c;保证了数据的稳定性与可靠性。通过使用Spring框架&#xff0c;实现了对各个模块的解耦&#xff0c;使得系统更易于维护与升级。前端使用了Node.jsVue以提供易用、美观的用…

spring复习:(4)AbstractEnvironment

该类中指定了激活profile属性的名称(spring.profiles.active)&#xff0c;默认profile属性的名称(spring.profiles.default)&#xff0c;以及默认的profile的名字(default)。

springboot项目集成nacos配置中心踩坑

前提 在使用nacos的配置中心功能&#xff0c;发现在application.yml中配置地址后仍然读取不到配置中心地址&#xff0c;配置项和值都是正确的。但就是读不到&#xff0c;现在来分析下 配置项 spring:application:name: test-servicemain:allow-bean-definition-overriding: …

Ubuntu 20.04 LTS x86_64 SPEC CPU 2006 cpu2006-1.2.iso 测试笔记

环境 安装依赖项 sudo apt install gfortran 挂载iso sudo mkdir /mnt/cpu2006 sudo mount cpu2006-1.2.iso /mnt/cpu2006 安装 cd /mnt/cpu2006 sh install.sh -d /home/speccpu/cpu2006 SPEC CPU2006 InstallationTop of the CPU2006 tree is /mnt/cpu2006Installing F…

【Vue3】学习笔记-toRef

作用 创建一个ref对象&#xff0c;其value值指向另一个对象中的某个属性。 语法 const nametoRef(person,‘name’) 应用 要将响应式对象中的某个属性单独提供给外部使用时 #扩展 toRefs与toRef功能一直&#xff0c;但可以批量创建多个ref对象,语法&#xff1a;toRefs(per…

浅谈消防应急照明和疏散指示系统在变电站的设计与应用

【摘要】&#xff1a;随着对消防安全重视程度的不断提高&#xff0c;消防设计要求更加严格。针对变电站的应用场景&#xff0c;以民用和工业建筑为对象设计的消防应急照明和疏散指示系统不宜直接套用。文章从变电站实际应用角度出发&#xff0c;梳理和对比了现行设计规范&#…

机器人制作开源方案 | 智能立体仓储系统模型

1. 功能说明 本文示例将通过程序控制模拟立体仓储系统的运动效果--模拟立体仓储系统进行运输货物时各个结构的运动方式。立体仓储系统的运动有整体系统的水平移动、载货台的纵向移动、货叉的平动&#xff0c;所有的运动表现形式都是旋转运动转化为平动。 2. 结构说明 该立体仓储…

netcat(nc)安装

网络工具中有“瑞士军刀”美誉的NetCat&#xff08;以下简称nc&#xff09;可以使用TCP或UDP协议的网络连接去读写数据。 问题 使用命令 nc -zv ip port 发现报错Ncat&#xff1a;Connection refused&#xff0c;其实是混淆了netcat&#xff08;nc&#xff09;与ncat where …

只要你会vue,5分钟学不会 svelte 你来找我

&#x1f33b; 前言 2023年了&#xff0c;国内前端领域基本被Vue、React占领市场&#xff0c;近几年似乎前端技术栈的迭代更新缓慢了下来。 当然近几年也出现了像svelte、solid.js等一些新兴的前端框架&#xff0c;这些框架有很多创新的点&#xff0c;比如svelte相比于vue,re…

SSTI-lab

Level-1 no waf {{2*2}}测试发现存在ssti漏洞 {{.__class__}}{{.__class__.__bases__[0]}}{{.__class__.__bases__[0].__subclasses__}}import requestsurl"http://node1.anna.nssctf.cn:28430/level/1"#payload{{.__class__.__bases__[0].__subclasses__()[1]}} …

基于智慧消防系统的建设与应用

安科瑞 华楠 【摘要】随着“智慧城市”建设热潮的兴起&#xff0c;对推动人类社会发展与进步发挥重要作用&#xff0c;而“智慧消防”作为“智慧城市”的重要组成部分&#xff0c;其建设工作也越来越受到社会各界人士的高度关注&#xff0c;这对推动“智慧城市”构建发挥作用。…

途乐证券|Prada总部上海荣宅失事?230亿龙头突现重大利空,黑马也被带崩

Prada和蔡徐坤同时刷屏&#xff01; 今天一早&#xff0c;Prada冲上微博热搜&#xff0c;原因是有网友称&#xff0c;“Prada总部上海荣宅起火”&#xff0c;相关视频在网上热传。据上海静安消防发布火情通报&#xff0c;2023年7月2日18时14分&#xff0c;静安区陕西北路靠近南…

登录校验-会话技术/JWT令牌

登录校验 会话技术 会话&#xff1a; 用户打开浏览器&#xff0c;访问web资源的时候&#xff0c;会话建立。直到一方断开连接&#xff0c;会话结束&#xff0c;一次会话中包含多次响应 会话跟踪&#xff1a;一种维护浏览器状态的方法&#xff0c;服务器需要识别多次请求是否来…

【MySQL】count()查询性能梳理

【MySQL】count()查询性能梳理 1、背景 使用的数据库是MySQL8&#xff0c;使用的存储引擎是Innodb。 通常情况下&#xff0c;分页接口一般会查询两次数据库&#xff0c;第一次是获取具体数据&#xff0c;第二次是获取总的记录行数&#xff0c;然后把结果整合之后&#xff0c…

【VB6|第19期】vb6通过COM组件操作Excel

日期&#xff1a;2023年7月3日 作者&#xff1a;Commas 签名&#xff1a;(ง •_•)ง 积跬步以致千里,积小流以成江海…… 注释&#xff1a;如果您觉得有所帮助&#xff0c;帮忙点个赞&#xff0c;也可以关注我&#xff0c;我们一起成长&#xff1b;如果有不对的地方&#xff…