C++——内存管理、模板
一、C++内存管理
在C语言中我们曾学习过动态内存管理的相关知识,通过malloc、calloc、realloc和free等对堆上的空间进行申请和释放。在C++中我们同样会面临类似的需求,因此C++对动态开辟内存的方式进行了一些调整,我们可以使用new和delete操作符来对堆空间进行空间管理。
①首先要明确的是new和delete的使用方法。new操作符后跟随需要开辟空间的类型,然后会返回一个指针。delete后跟随动态开辟出的指针并对其指向的空间进行释放。
②new可以在其后使用方括号来一次性申请多个同类型的空间,此时就是使用了操作符new[]。在释放空间的时候也应该对应匹配地使用delete[]来正确合理释放空间。
③new操作符在开辟空间时可以进行初始化,对于内置类型初始化值在类型后使用圆括号表示。对于一次申请了多个同类型空间,初始化使用大括号。如果没有大括号则认为没有初始化,得到的空间均为随机值;如果初始化了但不完全,那么没有初始化的部分会默认初始化为0。
④当new的delete的类型为自定义对象时,则会调用其对应的构造函数和析构函数。
class A
{
public:A(int a, int b):_a(a),_b(b){cout << "A(int, int)" << endl;}~A(){cout << "~A(int, int)" << endl;}
private:int _a;int _b;
};
int main()
{//对于内置类型:int* p1 = new int; //动态申请int类型空间int* p2 = new int(2); //使用圆括号动态申请的空间进行初始化int* p3 = new int[4]; //使用方括号标识申请的数量int* p4 = new int[6] {1, 2, 3}; //使用大括号进行初始化,不完全初始化下(new时使用了大括号),未初始化的空间默认为0delete p1; //释放空间使用deletedelete p2;delete[] p3; //释放new[]的空间,使用delete[]delete[] p4;//对于自定义类型A* pa1 = new A(1, 2); //new自定义类型时会自动调用构造函数进行初始化//A* pa1 = new A; //error,因为new自定义类型时会调用构造函数,A没有默认构造函数,所以会报错A* pa2 = new A[4]{ {1,2},{2,3},{3,4},{4,5} }; //new多个自定义类型变量并初始化delete pa1; //delete自定义类型时会自动调用析构函数进行销毁delete[] pa2; //delete[]释放new[]的空间//new的使用不需要进行检查,当出错时malloc会持续进行开辟空指针,new则会抛异常return 0;
}
⑤使用new申请空间时不需要进行检查(在C语言中我们会对malloc返回的指针进行非空检查),因为当开辟空间出现问题时,new会直接抛异常而不是返回空指针。
⑥对于new和delete,这二者是提供给我们所使用的动态内存申请和释放的操作符,而实际上还有操作系统提供的operator new和operator delete两个全局函数。new在使用时调用了operator new来帮助自己进行空间申请,同样的delete调用了operator delete来进行释放空间。而operator new和operator delete两个函数的开辟空间和释放空间实际上又是通过调用malloc和free来实现的。
这样一层层的调用看似复杂,实际上是这样一层层的包含才有了我们可以方便使用,功能完善的new。
同理,对于new[]和delete[]而言,调用了operator new[]和operator delete[]两个函数。然后由operator new[]和operator delete[]调用了operator new和operator delete。再然后调用了malloc和free来实现。
二、模板
在以往写代码的时候,常常会遇到针对不同类型的功能相同的函数,这些函数代码相同区别只在于类型不同,但却因此要写好几份来满足我们的需求。C++中引入模板的概念来很好的解决这个问题。
1. 函数模板
通过提供一个函数模板,在后续使用函数的时候,只需要标明所需要的类型即可由编译器根据我们所写的模板生成对应的函数。
在定义函数模板时,需要使用template关键字,然后使用尖括号和关键字typename或class来指定模板参数,该参数在使用中会由编译器自动推演为合适的类型。具体的使用,也就是函数模板实例化有两种方式,由编译器自动推演或者直接显式实例化。
当存在函数的同时又存在模板的情况下,若参数匹配则会优先选择函数,否则会使用模板。如果采取显式实例化的方式则会强制使用模板。
//函数模板
template<typename T>
void Swap(T& a, T& b)
{T tmp = a;a = b;b = tmp;
}
//模板和函数可以同时存在,调用时优先选择函数
//如果函数不够匹配,则使用模板
void Swap(int& a, int& b)
{int tmp = a;a = b;b = tmp;
}
template<class T1,class T2> //模板参数可以多个,以逗号分隔,关键字也可以是class
void func()
{}
int main()
{int a1 = 10, a2 = 20;cout << a1 << ' ' << a2 << endl;Swap(a1, a2); //函数模板实例化,int类型 //使用函数cout << a1 << ' ' << a2 << endl;double d1 = 1.2, d2 = 3.7;cout << d1 << ' ' << d2 << endl;Swap(d1, d2); //函数模板实例化,double类型 //使用模板cout << d1 << ' ' << d2 << endl;Swap<double>(d1, d2); //函数模板显式实例化 //显示实例化强制使用模板cout << d1 << ' ' << d2 << endl;return 0;
}
2. 类模板
类模板和函数模板非常相似,在之后我们会频繁接触到类模板。需要注意的是类模板中的成员函数声明与定义分离时需要在定义处附加模板参数列表,并且二者必须在同一文件中。
//类模板
template<class T>
class Stack
{
public:void Push(T x){}
private:T* _a;int _size;int _capacity;
};
int main()
{Stack<int> st1; //类模板实例化Stack<double> st2;return 0;
}
相关文章:
C++——内存管理、模板
一、C内存管理 在C语言中我们曾学习过动态内存管理的相关知识,通过malloc、calloc、realloc和free等对堆上的空间进行申请和释放。在C中我们同样会面临类似的需求,因此C对动态开辟内存的方式进行了一些调整,我们可以使用new和delete操作符来对…...
商品上传上货搬家使用1688商品采集api接口
1688.item_get 公共参数 名称类型必须描述keyString是调用key(必须以GET方式拼接在URL中)secretString是调用密钥api_nameString是API接口名称(包括在请求地址中)[item_search,item_get,item_search_shop等]cacheString否[yes,no…...
redisson解决redis服务器的主从一致性问题
redisson解决redis的主节点和从节点一致性的问题。从而解决锁被错误获取的情况。 实际开发中我们会搭建多台redis服务器,但这些服务器分主次,主服务器负责处理写的操作(增删改),从服务器负责处理读的操作,…...
Vue-router
router的使用(52) 5个基础步骤: 1.在终端执行yarn add vue-router3.6.5,安装router插件 yarn add vue-router3.6.5 2.在文件的main.js中引入router插件 import VueRouter from vue-router 3.在main.js中安装注册Vue.use(Vue…...
白皮书发布|超融合运行 K8s 的场景、功能与优势
目前,不少企业都使用虚拟化/超融合运行 Kubernetes 和容器化应用。一些用户可能会有疑惑:既然 Kubernetes 可以部署在裸金属上,使用虚拟化不是“多此一举”吗? 在电子书《IT 基础架构团队的 Kubernetes 管理:从入门到…...
全局Ceph节点宕机处理
在极端情况下,如数据中心断电,造成 Ceph 存储集群全局宕机,可以按照本节所示流程进行 Ceph 集群上电恢复操作。 4.1 手动上电执行步骤 如为 Ceph 集群上电,monitor server 应最先上电;集群上电前确认使用 Ceph 之前端…...
电脑中缺失EMP.dll文件怎么办,解决EMP.dll丢失问题的有效方法分享
当你的电脑出现由于找不到emp.dll无法继续执行代码的提示,那你要怎么办呢?其实解决方法还是挺多的,今天就来给大家详细的说说emp.dll这方面的信息吧。 一、电脑为什么会出现emp.dll丢失 不完全卸载软件:在卸载程序时,…...
Linux 进程程序替换
💓博主CSDN主页:麻辣韭菜-CSDN博客💓 ⏩专栏分类:http://t.csdnimg.cn/G90eI⏪ 🚚代码仓库:Linux: Linux日常代码练习🚚 🌹关注我🫵带你学习更多Linux知识 🔝ǵ…...
系统分析与设计(一)
我们有这么多各式各样的工具,互联网给我们带来了这么多用户和数据,这是好事也有副作用。 世界上能访问用户数据,并根据数据做分析和改进的公司,大概Google是其中翘楚,这种 data-centric 的做法做过了头,也有悲剧发生: Douglas Bowman 曾经是Google 的视觉设计主管,2009年的一天…...
【QT】自定义控件的示例
自定义控件(很重要) 什么是自定义控件? 顾名思义就是创建一个窗口,放入多个控件,拼接起来,一起使用。 为什么需要它? 需求,假设有100个窗口,那如果有两个控件同时被使…...
Rust入门:Rust如何调用C静态库的函数
关于Rust调用C,因为接口比较复杂,貌似Rust不打算支持。而对于C函数,则相对支持较好。 如果要研究C/Rust相互关系的话,可以参考: https://docs.rs/cxx/latest/cxx/ Rust ❤️ C 这里只对调用C静态库做一个最简短的介…...
阿里云Linux系统MySQL8忘记密码修改密码
相关版本 操作系统:Alibaba Cloud Linux 3.2104 LTS 64位MySQL:mysql Ver 8.0.34 for Linux on x86_64 (Source distribution) MySQL版本可通过下方命令查询 mysql --version一、修改my.cnf文件 文件位置:etc/my.cnf进入远程连接后可以打…...
初识C语言—字符串、转义字符、注释
字符串 字符串就是一串字符 用英文双引号括起来的字符 int main() {"dasgfhjkasg\n""hello world!"return 0; } 字符串的结束标志是\0这个转义字符 如何证明呢? int main() {//字符数组 - 数组是一组相同类型的元素char arr[] "hel…...
洛谷 P1731 [NOI1999] 生日蛋糕
题目 题目链接 自己没看题解写的,摸石头过河,解释一下 首先,输入输出都是正整数。先搞定输入,再判断条件,如果无解,输出0,否则输出蛋糕外表面面积Q(这里用全局变量,开l…...
操作教程|使用MeterSphere对恒生UFX系统进行压力测试
恒生UFX(United Finance Exchange,统一金融交换)系统(以下简称为“UFX系统”),是一款帮助证券公司统一管理外部接入客户的系统,该系统整体上覆盖了期货、证券、基金、银行、信托、海外业务等各类…...
算法中的数学知识
文章目录 算法中的数学知识约数约数个数约数之和 筛法求质数阶乘分解解法一解法二: 欧拉函数基本模板筛法求欧拉函数大数据幂的欧拉函数 快速幂费马小定理快速幂求逆元数论分块例题:[因数平方和](https://www.acwing.com/problem/content/4665/)分析:具体…...
2024高频前端面试题 Vue2 和 Vue3 篇
HTML和CSS篇:2024高频前端面试题 HTML 和 CSS 篇-CSDN博客 JavaScript 和 ES6 篇: 2024高频前端面试题 JavaScript 和 ES6 篇-CSDN博客 * Vue2 和 Vue3的区别: 1)双向数据绑定原理的区别 2)根节点的不同 Vue2只能一…...
vue,Promise备忘
网址 https://www.promisejs.org/ 记录 在Vue.js或者其他JavaScript项目中,Promise 是一种处理异步操作的标准机制,用于解决传统的回调地狱问题,提供了一种更优雅、链式调用的编程模型。Promise对象代表一个异步操作的结果,它可…...
软件测试工程师职位笔试知识点细节(2)
一、软件测试分为哪几个阶段,生命周期? 软件测试一般分为单元测试、集成测试和系统测试。 需求分析→测试计划→测试设计、软件开发→测试执行→测试评估 二、一条软件缺陷(或者叫Bug)记录都包含了哪些内容? 一条Bug…...
大数据冷热分离方案
数据冷热分离方案 1、背景 随着业务的发展,在线表中的数据会逐渐增加。常规业务都有冷热数据现象明显的特性(需要访问的都是近期产生的热数据;时间久远的冷数据出于备份、备案溯源等诉求会进行在线保留)。在业务表数据 量可控…...
Golang dig框架与GraphQL的完美结合
将 Go 的 Dig 依赖注入框架与 GraphQL 结合使用,可以显著提升应用程序的可维护性、可测试性以及灵活性。 Dig 是一个强大的依赖注入容器,能够帮助开发者更好地管理复杂的依赖关系,而 GraphQL 则是一种用于 API 的查询语言,能够提…...
工业自动化时代的精准装配革新:迁移科技3D视觉系统如何重塑机器人定位装配
AI3D视觉的工业赋能者 迁移科技成立于2017年,作为行业领先的3D工业相机及视觉系统供应商,累计完成数亿元融资。其核心技术覆盖硬件设计、算法优化及软件集成,通过稳定、易用、高回报的AI3D视觉系统,为汽车、新能源、金属制造等行…...
什么?连接服务器也能可视化显示界面?:基于X11 Forwarding + CentOS + MobaXterm实战指南
文章目录 什么是X11?环境准备实战步骤1️⃣ 服务器端配置(CentOS)2️⃣ 客户端配置(MobaXterm)3️⃣ 验证X11 Forwarding4️⃣ 运行自定义GUI程序(Python示例)5️⃣ 成功效果
目录 一、👋🏻前言 二、😈sinx波动的基本原理 三、😈波动起来 1.sinx节点介绍 2.vertexPosition 3.集成Vector3 a.节点Append b.连起来 4.波动起来 a.波动的原理 b.时间节点 c.sinx的处理 四、🌊波动优化…...
LINUX 69 FTP 客服管理系统 man 5 /etc/vsftpd/vsftpd.conf
FTP 客服管理系统 实现kefu123登录,不允许匿名访问,kefu只能访问/data/kefu目录,不能查看其他目录 创建账号密码 useradd kefu echo 123|passwd -stdin kefu [rootcode caozx26420]# echo 123|passwd --stdin kefu 更改用户 kefu 的密码…...
Java编程之桥接模式
定义 桥接模式(Bridge Pattern)属于结构型设计模式,它的核心意图是将抽象部分与实现部分分离,使它们可以独立地变化。这种模式通过组合关系来替代继承关系,从而降低了抽象和实现这两个可变维度之间的耦合度。 用例子…...
iview框架主题色的应用
1.下载 less要使用3.0.0以下的版本 npm install less2.7.3 npm install less-loader4.0.52./src/config/theme.js文件 module.exports {yellow: {theme-color: #FDCE04},blue: {theme-color: #547CE7} }在sass中使用theme配置的颜色主题,无需引入,直接可…...
MySQL 部分重点知识篇
一、数据库对象 1. 主键 定义 :主键是用于唯一标识表中每一行记录的字段或字段组合。它具有唯一性和非空性特点。 作用 :确保数据的完整性,便于数据的查询和管理。 示例 :在学生信息表中,学号可以作为主键ÿ…...
C语言中提供的第三方库之哈希表实现
一. 简介 前面一篇文章简单学习了C语言中第三方库(uthash库)提供对哈希表的操作,文章如下: C语言中提供的第三方库uthash常用接口-CSDN博客 本文简单学习一下第三方库 uthash库对哈希表的操作。 二. uthash库哈希表操作示例 u…...
淘宝扭蛋机小程序系统开发:打造互动性强的购物平台
淘宝扭蛋机小程序系统的开发,旨在打造一个互动性强的购物平台,让用户在购物的同时,能够享受到更多的乐趣和惊喜。 淘宝扭蛋机小程序系统拥有丰富的互动功能。用户可以通过虚拟摇杆操作扭蛋机,实现旋转、抽拉等动作,增…...
