c++内存管理和模板

C语言malloc calloc和realloc的弊端

C语言的这三个函数对于内置类型的处理是还可以的,但是对自定义类型就无法处理了,因为c++自定义类型在初始化的时候是自动调用构造函数的,而C语言的这三个函数是无法初始化内置类型的,于是我们下面要介绍new和delete两个关键字,所以在用new创造空间时,会自动调用构造函数,在用delete释放空间时,会自动调用析构函数

new和delete

new和delete的用法

operator new和operator delete实际上是通过malloc和free开启空间,只是new在申请新空间的时候,对于自定义类型会调用默认构造函数,delete在释放自定义类型的空间的时候,会先调用自定义类型的析构函数,然后再free掉这块空间
此外,new和malloc不一样,malloc失败后会返回空,而new不会返回空,若申请空间失败了,如果用户有执行相应措施,则它会调用相应措施,继续申请,如果没有,它会抛异常

const int N=100;
class stack
{stack(int capacity=4){_capacity=capacity;_size=0;arr=new int[_capacity];}~stack(){free(arr);_capacity=_size=0;}
private:int* arr;int _capacity;int _size;
};
stack* func(int n=10)
{stack* pst=new stack;return pst;
}
int main()
{int capacity=N;int* arr1=new int[capacity];//开辟数组 new datatype[]的方括号里面是完成对n个对象的调用申请delete[] arr1;//stack* pst=func(N);delete pst;//析构函数先把stack里的arr释放掉,delete再释放掉pst指向的空间
}

如果你想捕获异常,可以用以下代码

int main()
{ try{char* p=new char[0x7fffffff];//可更换//即使是一个函数,也可以在异常处中断,跳到catch}catch(const exception& e){cout<<e.what()<<endl;}return 0;
}

不匹配问题

有时候我们会malloc,new,free,delete,new[ ],delete[ ]混着用,这是会出问题的

class V
{
public:stack(int a=1):_a(a){}//但一旦我加上析构函数,这里就会报错了
private:int _a;
};
int main()
{stack* pst=new stack;free(pst);//会报错,因为内存泄漏delete(pst);//正常A* pA=new A[10];//free(pA);//报错//delete pA;//报错delete[]pA;
}

为什么有了析构函数就会报错呢?因为在new 出n个空间的时候,编译器会在空间前面加四个字节,用来存储对象的个数,但是只返回cur的位置
在这里插入图片描述
我们在申请内存的时候不能只申请一部分,如果上面用free或者delete的话,会从cur位置开始释放,而不是从最开始位置开始释放,只有delete[ ]会往前偏移四个字节,至于为什么有析构函数编译器就会报错的问题,编译器在没有析构函数的时候会自动去优化,而有析构函数的时候不得不执行,然后就报错了

定位new

构造函数不能显式调用,析构函数可以显式调用,如果我们一定要调用构造函数的话,可以用下面这种方法

class stack
{
public:stack(int capacity=4){_capacity=capacity;_size=0;arr=new int[_capacity];}
private:int* arr;int _size;int _capacity;
};
int main()
{stack* pst1=new stack;pst1->stack();//不允许new(pst1)stack();//定位newreturn 0;
}

malloc,new,free,delete的区别

1.malloc和free是函数,而new和delete是操作符
2.malloc申请的空间不会初始化,而new开辟的空间会初始化
3.malloc申请空间的时候,需要手动计算申请空间,而new只需要在new后面加上类型,若有多个,则可以在类型后面加上[数量]
4.malloc返回的类型是void*,需要强转,而new不需要强转,因为new后面跟着的就是空间类型
5.malloc失败后会返回空,而new失败后会报错,需要捕获异常
6.malloc和free在使用的时候只会开辟空间,而new在使用的时候会先开空间,再调用构造函数,而delete会先调用析构函数,再去释放空间

泛型编程

泛型编程就是针对广泛的类型去编程,我们在实现交换函数swap的时候每次都只能实现一种类型的交换,虽然说我们用函数重载可以解决一部分的问题,但仍然存在着缺陷,因为他们内部的逻辑都是一样的,只有类型不一样,但又不得不写,就会显得代码很繁琐

void swap(int& a1,int& a2)
{int tmp=a1;a1=a2;a2=tmp;
}
void swap(char& a1,char& a2)
{char tmp=a1;a1=a2;a2=tmp;
}
void swap(double& a1,double& a2)
{double tmp=a1;a1=a2;a2=tmp;
}

如果我们有函数模板就可以解决这个问题

函数模板

template<class T>
void swap(T& a1,T& a2)
{T tmp=a1;a1=a2;a2=tmp;
}
int main()
{int a1=1,a2=2;double b1=1.0,b2=2.0;swap(a1,a2);//隐式实例化swap(b1,b2);
}

我们去用不同类型调试的时候会发现它都进入了同一个函数代码,但实际上它进去的是编译器通过T模板实例化后的函数,所以他们调用的是不一样的函数,如果你进入函数反汇编去看,你会发现这两个swap函数的汇编代码有一句不一样,一个是swap< int >(地址),另一个是swap< double >(地址)

类模板

我们在写一些类的时候,比如说栈,有时候我们栈只能写一个int类型,然后拷贝一份再写一个double类型,但内部的逻辑都是一样的,会很麻烦,所以类也引进了类模板

template<class T>
class stack
{
public:stack(int capacity=4):_size(0),_capacity(capacity){arr=new T[_capacity];}~stack(){delete[] arr;_size=_capacity=0;}
private:T* arr;int _size;int _capacity;
};
//我们在使用的时候在类的后面要加入模板类型
int main()
{stack<int> st1;stack<double> st2;//显式实例化return 0;
}

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

JetBrains`s IntelliJ IDEA springboot项目 gradle-bin安装 国内加速

gradle wapper加速 可以看到&#xff0c;一般我们直接init的springboot项目会默认使用wapper来安装不同版本的gradle&#xff0c;但services.gradle.org网速过慢&#xff0c;我们选择切换为国内源 发现一篇同样的文档,并在此补充多个源 源名urlgradle(原本)https\://service…

网站如何针对不同的DDOS进行防御?

建设网站租用服务器是多数企业及个人的选择&#xff0c;一个安全稳定的服务器对网站的重要性无需再赘述。要保证服务器租用的安全和稳定&#xff0c;除了需要服务器自身有强大的硬、软件基础之外&#xff0c;还需要防范外部的一些因素&#xff0c;常见的就是各种网络攻击&#…

接口测试 —— 如何设计高效的测试用例!

摘要&#xff1a; 随着互联网应用的日益复杂化&#xff0c;接口测试已成为保证软件质量不可或缺的一部分。本文将探讨如何有效地设计接口测试用例&#xff0c;并提供实用的建议和示例。 一、引言 接口测试&#xff08;API测试&#xff09;是确保系统各部分之间交互正确性的关键…

信息安全--(四)网络安全体系与安全模型(二)

其他安全模型 ■纵深防御模型&#xff1a;①安全保护②安全监测③实时响应④恢复 ■分层防护模型&#xff1a;参考OSI模型&#xff0c;对保护对象进行层次化保护。 ■等级保护模型&#xff1a;将信息系统划分成不同安全保护等级&#xff0c;采取相 应的保护措施。 ■网络生…

【MySQL-24】万字全面解析<索引>——【介绍&语法&性能分析&使用规则】

前言 大家好吖&#xff0c;欢迎来到 YY 滴MySQL系列 &#xff0c;热烈欢迎&#xff01; 本章主要内容面向接触过C的老铁 主要内容含&#xff1a; 欢迎订阅 YY滴C专栏&#xff01;更多干货持续更新&#xff01;以下是传送门&#xff01; YY的《C》专栏YY的《C11》专栏YY的《Lin…

视频智能分析打手机检测算法安防监控打手机检测算法应用场景、算法源码、算法模型介绍

随着智能手机的普及&#xff0c;手机已成为人们生活中不可或缺的一部分。然而&#xff0c;在某些场合&#xff0c;如驾驶、会议、学校课堂等&#xff0c;不当使用手机可能会导致安全隐患或干扰他人。因此&#xff0c;开发出一种能够准确识别并阻止不当使用手机的行为检测算法显…

网吧业务安全对抗(有源码)

网吧业务竞争激烈&#xff0c;网吧都会有以下系统软件。 无盘: 无盘是指没有硬盘。好处是统一维护管理和节约成本。本人研究无盘好几年&#xff0c;后面会专门发帖介绍。 计费: 是指收费系统。 营销软件: 包括销售饮品、‌零食和向客户发送电子邮件营销和短信营销等。产品如…

springboot,maven多模块开发,子模块获取不到父模块添加的依赖,有多个root模块问题解决

错误示范 我以为放进去然后重载一下就是子模块了 导致后续在外层加的依赖&#xff0c;其article都接收不到 解决方案 需要在父模块的modules注册子模块 修改前后对比 此时子模块也能获取父模块的依赖

在Ubuntu/Linux下重温FC游戏——超级玛丽奥

文章目录 在Ubuntu/Linux下重温FC游戏——超级玛丽奥1 概述2 安装 FCEUX 模拟器3 下载 FC ROMS4 重温时光 在Ubuntu/Linux下重温FC游戏——超级玛丽奥 1 概述 FC 游戏机&#xff0c;是任天堂生产、发行和销售的 8 位第三世代家用游戏机&#xff0c;日本版官方名称为家庭电脑&…

Java源码学习之高并发编程基础——AQS源码剖析之线程间通信之条件等待队列

1.前言&目录 前言&#xff1a; 在Java中&#xff0c;使用synchronized关键字构建的锁&#xff0c;线程间通信可以使用某对象实例的wait/notify机制完成。AQS同样也提供了一套线程间通信的解决方案——条件等待队列。 在AQS源码分析的两篇文章AQS源码分析&#xff08;上&am…

逻辑器件输出高阻态时,输出端口的电平是什么状态呢?

高阻态是逻辑器件输出端口的一种状态&#xff0c;当端口处于高阻态时&#xff0c;输入端口的电平变化不会引起输出端口变化&#xff0c;不会对与之相连的后级输入端口或总线产生影响&#xff0c;对于总线架构的电路极为重要。   输出端口处于高阻态时&#xff0c;输出端口处于…

优秀软件工程师的工作思维

引言 在快速迭代的软件开发领域&#xff0c;软件工程师不仅需要精通编程技术&#xff0c;还需要具备产品思维、技术思维和工程思维&#xff0c;这三种思维相辅相成&#xff0c;共同推动产品的成功。本文将借鉴陈春花等管理学者的思考方式&#xff0c;深入剖析软件工程师如何在…

数据恢复工具,电脑+手机双端,十分好用!

哈喽&#xff0c;各位小伙伴们好&#xff0c;我是给大家带来各类黑科技与前沿资讯的小武。 今天给大家安利两款数据恢复工具&#xff0c;分别为电脑手机双端&#xff0c;无论是因为格式化误操作、设备损坏还是其他意外情况&#xff0c;都能轻松找回重要的文件、照片、视频等数…

什么是串口服务器?

1.什么是串口服务器&#xff1f; 了解串口服务器之前&#xff0c;我们需要先了解什么串口。 串口&#xff1a;又叫串行数据接口&#xff0c;主要是用来表示传递各种的数据的通信接口&#xff0c;通常指COM口。一般分为RS232、RS422、与RS485三种。RS232接口&#xff1a;采用全…

Datawhale X 李宏毅苹果书 AI夏令营 Task_1深度学习详解入门

目录 一、机器学习的基本概念 二、机器学习的主要任务类型 三、案例学习&#xff08;以视频的点击次数预测为例&#xff09; 四、梯度下降问题 一、机器学习的基本概念 机器学习&#xff0c;顾名思义&#xff0c;是让机器具备学习的能力。具体来说&#xff0c;机器学习就是…

ASP.NET MVC+LayUI视频上传完整教程

前言 前段时间在使用APS.NET MVCLayUI做视频上传功能的时&#xff0c;发现当上传一些内存比较大的视频就会提示上传失败&#xff0c;后来通过查阅相关资料发现.NET MVC框架为考虑安全问题&#xff0c;在运行时对请求的文件的长度&#xff08;大小&#xff09;做了限制默认为4M…

维信小程序禁止截屏/录屏

一、维信小程序禁止截屏/录屏 //录屏截屏,禁用wx.setVisualEffectOnCapture({visualEffect:hidden});wx.setVisualEffectOnCapture(Object object) 测试安卓手机&#xff1a; 用户截屏&#xff0c;被禁用 用户录屏&#xff0c;录制的是空白内容/黑色内容的视频。 二、微信小…

一种常用嵌入式开发代码库

链接&#xff1a;https://gitee.com/zhangxinyuanqi/varch 使用开源协议&#xff1a;GPL-2.0 varch简介 varch&#xff08;we-architecture&#xff0c;意为我们的框架库&#xff09;是嵌入式C语言常用代码模块库&#xff0c;包含了嵌入式中常用的算法库, 数据结构&#xff…

【云原生系列之SkyWalking的部署】

1、分布式链路追踪 1.1概念 在较大的web集群和微服务环境中&#xff0c;客户端的一次请求需要经过不同的模块&#xff0c;多个不同中间件&#xff0c;多个不同机器一起相互协作才能处理完成客户端的请求&#xff0c;而在这一系列的请求过程之中,处理流程可能是串行执行,也可能…

SprinBoot+Vue实验室考勤管理微信小程序的设计与实现

目录 1 项目介绍2 项目截图3 核心代码3.1 Controller3.2 Service3.3 Dao3.4 application.yml3.5 SpringbootApplication3.5 Vue3.6 uniapp代码 4 数据库表设计5 文档参考6 计算机毕设选题推荐7 源码获取 1 项目介绍 博主个人介绍&#xff1a;CSDN认证博客专家&#xff0c;CSDN平…