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

[C++ ]:7.内存管理+模板引入。

内存管理+模板引入

  • 一.内存管理:
    • 1.内存区域划分图:
    • 2.区域划分实例:
    • 3.C++ 内存管理方式:new+delete
    • 4.自定义类型的new和delete:
      • 一.简单类:
      • 二.日期类:
      • 三.栈类:
      • 四.队列类(栈实现队列):
    • 5.operato new 和 operator delete 函数?
      • 5-7:总结:
        • 1.对于内置类型操作:
        • 2.对于自定义类型
        • 3.区别总结:
    • 6.底层过程:
    • 7.常见面试题目:
  • 二.模板引入(泛型编程):
    • 0.泛型编程:
    • 1.函数模板:
    • 2.类模板:
    • 4.类模板的举例子!

一.内存管理:

1.内存区域划分图:

C/C++程序中的内存划分
在这里插入图片描述

2.区域划分实例:

在这里插入图片描述
总结:为什么有这么多的区域?
1.不同的数据变量需要不同的空间去存放:
2.不同的数据对于程序有不同的公用!

3.C++ 内存管理方式:new+delete

C语言内存管理方式在C++中可以继续使用,但有些地方就无能为力,而且使用起来比较麻烦,因此C++又提出了自己的内存管理方式:通过new和delete操作符进行动态内存管理。

在这里插入图片描述

注意:
1.new和delete对应 :申请和释放单个元素空间 。
2.new 类型[] 和 delete[] 对应 :申请和释放多个元素空间。
3.对于上面的操作其实C语言中的开辟动态开辟也可以做的到那么为什么C++中要加入nwe和delete呢?

4.自定义类型的new和delete:

一.简单类:

1.单个开空间
在这里插入图片描述
2.单个的销毁:
在这里插入图片描述

3.多个开空间和多个销毁
在这里插入图片描述

二.日期类:

在这里插入图片描述

三.栈类:

之前的类的delete都是去调用默认析构函数进行的空间释放因为类型比较简单不会涉及到深浅拷贝的问题,对于栈这个类就不一样了!

在这里插入图片描述
在这里插入图片描述

四.队列类(栈实现队列):

在这里插入图片描述

5.operato new 和 operator delete 函数?

大致概念:

new和delete是用户进行动态内存申请和释放的操作符
operator new 和operator delete是系统提供的全局函数,new在底层调用operator new全局函数来申请空间,delete在底层通过operator delete全局函数来释放空间。

通过日期类和反汇编观察函数执行过程:

1.nwe去调用operator new函数:

在这里插入图片描述

2.jmp 命令跳到operator new 全局函数:

请添加图片描述

3.调用ooperator new 函数进行开辟空间不初始化!

注意观察:
1.operator new 里面调用了malloc函数:
2.本质使用了malloc函数进行空间开辟:
请添加图片描述

4.delet 调用ooperator delete
在这里插入图片描述

5.jmp 到对应operator delete:
在这里插入图片描述
在这里插入图片描述

6.使用定义operator delete

1.operator delete 里面调用了函数:
2.本质使用了free函数进行空间释放:

在这里插入图片描述

5-7:总结:

1.对于内置类型操作:

new和delete malloc和free 没有区别的,可以不用考虑new和delete不对应的情况!因为自定义类型不需要考虑调用多少次析构函数这个问题!

2.对于自定义类型

2-1.对于自定义类型操作:
new和delete malloc和free 有区别的,需要考虑new和delete不对应的情况?

观察一下栈类空间开的大小?

在这里插入图片描述
解释开辟多个数据只需要在new的时候去写[n]不需要在delete的时候去写数值,并且对于自定义类型是这样的是因为自定义类型可以知道调用多少次析构函数释放空间。

3.区别总结:

为什么使用operatot new 进行封装呢?
因为malloc 开辟空间失败会返回空指针,operator new 开辟空间失败会抛出异常!

为什么使用operator delete 进行封装呢 ?

1.经过封装可以找到需要调用析构函数的次数并且多次调用析构函数对于自定义类型看多个空间的情况

2.对于单个空间只需要调用一次析构函数就可以了!

6.底层过程:

new
1.调用operator new 进行空间开辟:
2.调用构造函数进行空间的初始化:

delete
1.调用析构函数进行空间的内层释放:
2.调用operator delete 进行空间的外层释放:

补充:
1.operator new 是不可以显示调用的!
2.operator delete 是可以进行显示调用的!

在这里插入图片描述

7.常见面试题目:

用法+原理:

  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在释放空间前会调用析构函数完成空间中资源的清理。

二.模板引入(泛型编程):

0.泛型编程:

在这里插入图片描述

有没有一种方法可以创造一个模板去使用自定义类型去使用!
那能否告诉编译器一个模子,让编译器根据不同的类型利用该模子来生成代码呢?

1.函数模板:

1.使用关键字: template
2.放在函数定义的前面可以进行类型的控制了!
3.注意:typename是用来定义模板参数关键字,也可以使用class(切记:不能使用struct代替class)
4.函数模板是一个蓝图,它本身并不是函数,是编译器用使用方式产生特定具体类型函数的模具。所以其实模板就是将本来应该我们做的重复的事情交给了编译器

在这里插入图片描述

  1. 隐式实例化:让编译器根据实参推演模板参数的实际类型.
    在这里插入图片描述

3.底层原理:

那么这个函数是如何调用的呢?
两个swap会去使用同一个swap函数吗?
通过反汇编去观察具体的情况!

在这里插入图片描述
在这里插入图片描述

通过观察我们会发现两个swap函数调用去call的函数的参数不同(通过模板和传参确定的),并且地址也不相同说明通过模板和参数的不同实例化了两个swap函数这个操作是编译器自己完成的。

用不同类型的参数使用函数模板时,称为函数模板的实例化。
模板参数实例化分为:隐式实例化和显式实例化。

  1. 显式实例化:在函数名后的<>中指定模板参数的实际类型

在这里插入图片描述
4.优先级问题:

如果存在两个都可以满足的函数编译器优先匹配程度更高的内容
不去实例化就会节省空间:

// 专门处理int的加法函数
int Add(int left, int right)
{return left + right;
}
// 通用加法函数
template<class T>
T Add(T left, T right)
{return left + right;
}void text()
{//优先调用处理int的函数不会去用模板进行实例化!int a,b;Add(a,b)double c,d;Add(c,d)
}

2.类模板:

1.我们之前使用C语言实现的一个栈对于存贮数据类型的控制我们是使用typedef 进行类型的重命名去改变栈中的数据类型的方法!
2.这个方法其实不是很方便比如说我们有一个类需要两个类型数据内容的栈我们如果用之前的方法需要写两份相同的代码只有数据类型不相同。
3.解决:这个时候我们就可以使用类模板去解决这个问题:
4.注意:类的成员函数的定义和声明不可以分离!

在这里插入图片描述

4.类模板的举例子!

vector 和 list的使用:

在这里插入图片描述

相关文章:

[C++ ]:7.内存管理+模板引入。

内存管理模板引入 一.内存管理&#xff1a;1.内存区域划分图&#xff1a;2.区域划分实例&#xff1a;3.C 内存管理方式&#xff1a;newdelete4.自定义类型的new和delete&#xff1a;一.简单类&#xff1a;二.日期类&#xff1a;三.栈类&#xff1a;四.队列类&#xff08;栈实现…...

【计算机网络】HTTPS

文章目录 前言为什么会出现 HTTPSHTTPS 是如何进行加密的1. 对称加密非对称加密中间人攻击3. 引入证书 前言 前面我们学习了应用层中使用比较常见的 HTTP 协议&#xff0c;但是呢&#xff1f;在实际的使用中&#xff0c;浏览器和服务器之间的通信其实很少使用到 HTTP&#xff…...

阿里云服务器怎么样?阿里云服务器优势、价格及常见问题介绍

阿里云&#xff08;Alibaba Cloud&#xff09;是阿里巴巴集团旗下的云计算服务提供商&#xff0c;其提供的云服务器&#xff08;ECS&#xff09;是其核心服务之一。在云计算市场中&#xff0c;阿里云服务器备受用户的青睐&#xff0c;那么&#xff0c;阿里云服务器究竟怎么样呢…...

【狂神说Java】Dubbo + Zookeeper

✅作者简介&#xff1a;CSDN内容合伙人、信息安全专业在校大学生&#x1f3c6; &#x1f525;系列专栏 &#xff1a;狂神说Java &#x1f4c3;新人博主 &#xff1a;欢迎点赞收藏关注&#xff0c;会回访&#xff01; &#x1f4ac;舞台再大&#xff0c;你不上台&#xff0c;永远…...

Pytorch实战教程(三)-构建神经网络

0. 前言 我们已经学习了如何从零开始构建神经网络,神经网络通常包括输入层、隐藏层、输出层、激活函数、损失函数和学习率等基本组件。在本节中,我们将学习如何在简单数据集上使用 PyTorch 构建神经网络,利用张量对象操作和梯度值计算更新网络权重。 1. PyTorch 构建神经网…...

简单处理一下挖矿进程

接收服务器异常报警短信,进入服务器查看进程,显示cpu高占率的进程, $ top -c PID USER PR NI VIRT RES SHR S %CPU %MEM TIME COMMAND …...

ES6学习笔记

数据类型&#xff1a;Number, String, Boolean, array , tuple&#xff0c;enum&#xff0c;any&#xff0c;Null, Undefined, Object, void&#xff0c; never 扩展运算符... 数据结构&#xff1a;Array, Set, Map 装饰器是一种函数&#xff0c;写成 函数名 类的装饰&…...

U-Mail邮箱系统,政务邮箱国产化改造优质之选

近年来&#xff0c;我国电子政务进入了全面铺开快速发展的阶段&#xff0c;政府机构的信息化管理能力也大幅提升。但是&#xff0c;随着国际形势的新变化&#xff0c;国家主管部门陆续出台相关政策&#xff0c;全面指导并要求政府机构落实国产化信息技术建设。因此&#xff0c;…...

C++ 数组学习资料

C 数组学习资料 目录 什么是数组&#xff1f;声明和初始化数组访问数组元素多维数组数组和指针常见的数组操作数组的限制和注意事项 什么是数组&#xff1f; 在 C 中&#xff0c;数组是一种用于存储相同类型元素的数据结构。它是一个固定大小的连续内存块&#xff0c;每个元…...

LabVIEW在OPC中使用基金会现场总线

LabVIEW在OPC中使用基金会现场总线 本文讨论了如何使用开放的OPC&#xff08;用于过程控制的OLE&#xff09;接口访问基金会现场总线网络和设备。 NI-FBUS通信管理器随附了一个OPC数据访问服务器。 &#xff08;NI-FBUS Configurator自动包含NI-FBUS通信管理器。&#xff09…...

京东数据分析:2023年Q3户外鞋服市场分析报告(冲锋衣行业销售数据分析)

从露营、骑行、徒步、桨板、垂钓、飞盘、滑雪到如今的city walk&#xff0c;近两年户外运动已经成为了年轻人新的生活方式。户外运动的爆发也刺激了人们对于鞋服在穿搭、场景化、专业性功能等方向的需求&#xff0c;户外鞋服市场迎来增长。 而全国性的降温则带给目前的户外鞋服…...

使用Pytorch的一些小细节(一)

文章目录 前言数据结构-张量max函数索引函数赋值函数拼接函数 前言 由于不经常动手写代码&#xff0c;所以对于python语言中的常见数据结构的用法也不是很熟悉&#xff0c;对于pytorch中的数据结构就更加不熟悉了。之前的代码基础是基于C语言的&#xff0c;属性都是自己定义&a…...

PDF Expert for mac(专业pdf编辑器)苹果电脑

PDF Expert for Mac 是一款功能强大、界面简洁的PDF阅读、编辑和转换工具&#xff0c;为Mac用户提供了全面而便捷的PDF处理体验。无论是日常工作中的文档阅读、标注&#xff0c;还是专业需求下的编辑、转换&#xff0c;PDF Expert 都能满足您的各种需求。 首先&#xff0c;PDF…...

班级新闻管理系统asp.net+sqlserver

班级新闻管理系统 附加功能 新闻图片&#xff0c;点击次数访问自增&#xff0c;每个人都只能增删改查自己发布的新闻&#xff0c;并可以看到所有人发布的新闻 运行前附加数据库.mdf&#xff08;或sql生成数据库&#xff09; 主要技术&#xff1a; 基于asp.net架构和sql serve…...

navicat导入.sql文件出现:[ERR] 1067 - Invalid default value for ‘create_date‘

比较老的系统生成的数据库导入5.7时报错[Err] 1067 - Invalid default value for create_time 错误分析 表中的第一个TIMESTAMP列&#xff08;如果未声明为NULL或显示DEFAULT或ON UPDATE子句&#xff09;将自动分配DEFAULT CURRENT_TIMESTAMP和ON UPDATE CURRENT_TIMESTAMP属…...

Labview利用声卡捕获波形

一般的计算机上自带的声卡&#xff0c;均既有A/D功能&#xff0c;又有D/A功能&#xff0c;就是一款具备基本配置的数据采集卡&#xff0c;并且技术成熟&#xff0c;性能稳定。 后台如下&#xff1a;...

ElasticSearch7.x - HTTP 操作 - 索引操作

创建索引 对比关系型数据库,创建索引就等同于创建数据库 在 Postman 中,向 ES 服务器发 PUT 请求 :http://192.168.254.101:9200/shopping 说明 {"acknowledged"【响应结果】: true, # true 操作成功"shards_acknowledged"【分片结果】: true, # 分片操…...

Banana Pi BPI-M6(Raspberry Pi 5 替代品)初始设置及固件烧录

Banana Pi BPI-M6&#xff1a;初始设置和镜像烧录 Banana Pi BPI-M6 的首次测试 在上一篇文章中&#xff0c;我比较了Banana Pi BPI-M6和Raspberry Pi 5的硬件特性。两者都拥有出色的硬件技术&#xff0c;在性能方面应该不会有太大的问题。 今天我想测试一下 Banana Pi。作为…...

Ubuntu18.04.6安装qt5.7.1(超级详细教程)

目录 1、下载对应Linux版本的qt 2、安装完qt&#xff0c;可能也要安装下对应的编译工具 1、下载对应Linux版本的qt &#xff08;1&#xff09;准备安装的是qt5.7.1&#xff1a;qt-opensource-linux-x64-5.7.1.run &#xff08;2&#xff09;在虚拟机进入存放qt安装包的目录…...

进程线程

从Android3.0开始&#xff0c;系统要求网络访问必须在子线程中进行&#xff0c;否则会抛出异常&#xff0c;这么做是为了避免主线程被阻塞而导致ANR&#xff0c;那么网络访问的操作就必须要放到线程中去执行。 进程 进程是操作系统结构的基础&#xff0c;是程序在一个数据集合…...

Mybatis逆向工程,动态创建实体类、条件扩展类、Mapper接口、Mapper.xml映射文件

今天呢&#xff0c;博主的学习进度也是步入了Java Mybatis 框架&#xff0c;目前正在逐步杨帆旗航。 那么接下来就给大家出一期有关 Mybatis 逆向工程的教学&#xff0c;希望能对大家有所帮助&#xff0c;也特别欢迎大家指点不足之处&#xff0c;小生很乐意接受正确的建议&…...

工程地质软件市场:发展现状、趋势与策略建议

一、引言 在工程建设领域&#xff0c;准确把握地质条件是确保项目顺利推进和安全运营的关键。工程地质软件作为处理、分析、模拟和展示工程地质数据的重要工具&#xff0c;正发挥着日益重要的作用。它凭借强大的数据处理能力、三维建模功能、空间分析工具和可视化展示手段&…...

ETLCloud可能遇到的问题有哪些?常见坑位解析

数据集成平台ETLCloud&#xff0c;主要用于支持数据的抽取&#xff08;Extract&#xff09;、转换&#xff08;Transform&#xff09;和加载&#xff08;Load&#xff09;过程。提供了一个简洁直观的界面&#xff0c;以便用户可以在不同的数据源之间轻松地进行数据迁移和转换。…...

九天毕昇深度学习平台 | 如何安装库?

pip install 库名 -i https://pypi.tuna.tsinghua.edu.cn/simple --user 举个例子&#xff1a; 报错 ModuleNotFoundError: No module named torch 那么我需要安装 torch pip install torch -i https://pypi.tuna.tsinghua.edu.cn/simple --user pip install 库名&#x…...

用机器学习破解新能源领域的“弃风”难题

音乐发烧友深有体会&#xff0c;玩音乐的本质就是玩电网。火电声音偏暖&#xff0c;水电偏冷&#xff0c;风电偏空旷。至于太阳能发的电&#xff0c;则略显朦胧和单薄。 不知你是否有感觉&#xff0c;近两年家里的音响声音越来越冷&#xff0c;听起来越来越单薄&#xff1f; —…...

Java编程之桥接模式

定义 桥接模式&#xff08;Bridge Pattern&#xff09;属于结构型设计模式&#xff0c;它的核心意图是将抽象部分与实现部分分离&#xff0c;使它们可以独立地变化。这种模式通过组合关系来替代继承关系&#xff0c;从而降低了抽象和实现这两个可变维度之间的耦合度。 用例子…...

mac 安装homebrew (nvm 及git)

mac 安装nvm 及git 万恶之源 mac 安装这些东西离不开Xcode。及homebrew 一、先说安装git步骤 通用&#xff1a; 方法一&#xff1a;使用 Homebrew 安装 Git&#xff08;推荐&#xff09; 步骤如下&#xff1a;打开终端&#xff08;Terminal.app&#xff09; 1.安装 Homebrew…...

API网关Kong的鉴权与限流:高并发场景下的核心实践

&#x1f525;「炎码工坊」技术弹药已装填&#xff01; 点击关注 → 解锁工业级干货【工具实测|项目避坑|源码燃烧指南】 引言 在微服务架构中&#xff0c;API网关承担着流量调度、安全防护和协议转换的核心职责。作为云原生时代的代表性网关&#xff0c;Kong凭借其插件化架构…...

WEB3全栈开发——面试专业技能点P4数据库

一、mysql2 原生驱动及其连接机制 概念介绍 mysql2 是 Node.js 环境中广泛使用的 MySQL 客户端库&#xff0c;基于 mysql 库改进而来&#xff0c;具有更好的性能、Promise 支持、流式查询、二进制数据处理能力等。 主要特点&#xff1a; 支持 Promise / async-await&#xf…...

【大模型】RankRAG:基于大模型的上下文排序与检索增强生成的统一框架

文章目录 A 论文出处B 背景B.1 背景介绍B.2 问题提出B.3 创新点 C 模型结构C.1 指令微调阶段C.2 排名与生成的总和指令微调阶段C.3 RankRAG推理&#xff1a;检索-重排-生成 D 实验设计E 个人总结 A 论文出处 论文题目&#xff1a;RankRAG&#xff1a;Unifying Context Ranking…...