C++内存管理(2)+模版初阶

目录

1.内存的划分

 2.内存泄漏

3.模版初阶

(1)模版的引入

(2)函数模版

(3)类模版

(4)类型的不匹配问题


1.内存的划分

(1)C++里面,把内存划分为栈区,堆区,常量区(代码段),静态区(数据段)等等;

(2)我们熟知的函数栈帧就是属于栈区的一部分的,我们平常无论是使用C语言里面的malloc还是C++里面的new动态开辟空间,这个新开辟的空间都是在堆区上面的;

(3)下面我们通过一个具体的题目看一下不同的变量所处的区域:

我们通过下面的问题来了解一下内存区域的划分:

(1)globalVar是属于全局变量的,全局变量就是在静态区的,staticGlobalVar是属于静态的变量的,这个肯定是在静态区的;

(2)staticVar是属于局部的静态变量,无论是静态的局部变量还是全局的静态变量,都是在静态区的;

(3)localVar是属于一个局部变量,位于栈帧上面,栈帧就是属于栈区的;

(4)num1是一个数组,数组的本质就是指针,数组也是一个局部的数组,所以这个数组也是属于栈区上面的;

(5)char2和num1本质都是一样的,只不过num1指定了数组的大小空间是容纳的10个数据,但是这个char2虽然没有指定数组里面的元素的个数,但是这个数组同样是局部的,位于栈区;实际上char2右边有几个字符加上斜杠0就开辟多大的空间;

(6)对于pchar3和ptr1而言,我们的pchar3虽然是const进行修饰,这个只能说明这个字符串是常量字符串,是不可以进行修改的,常量字符串位于常量区,但是这个pchar3指针同样是局部的,位于栈区;

(7)请看下面的图片pchar3和ptr1都在栈区,但是其指向的数据不在栈区,pchar3指向的数据位于常量区域,属于常量字符串;ptr1指向的区域在堆区,因为ptr1属于是动态开辟的空间,我们之前已经提及到过动态开辟的空间都是在堆区上面的;

(8)因此对pchar3进行解引用,就会找到常量区里面的常量字符串,8pchar3属于常量区域,对于ptr1进行解引用就会找到堆区上面动态开辟的空间,因此*ptr1属于堆区;

char2就不一样了,因为char2没有const进行修饰,因此它的内容不会放到常量区域里面,因此无论是char2还是*char2,都是在栈区的;

 2.内存泄漏

(1)内存泄漏就是我们自己开辟的空间忘记释放掉,对于我们一般的程序其实没有释放也不会有什么危害,因为我们不会写特别大的程序,我们写的代码经过运行之后就算我们自己没有进行释放,编译器也会帮助我们释放掉;

(2)但是这个并不是意味着我们可以不用进行内存的手动的释放,对于一些服务器,以及一些经常使用的app,不进行内存的释放危害是非常大的;

(3)内存泄漏对于大型服务器以及一些操作系统而言,会导致程序越来越卡,直到卡死。

3.模版初阶

(1)模版的引入

上面是我们想要实现不同的数据类型的变量数值交换,但是我们必须要写多个函数,一种数据类型匹配一个对应的函数,这样做的话就会显得非常的冗余,我们想要一个东西,可以让不同的数据类型套进去都可以使用,这个东西就是模版;

(2)函数模版

根据上面的交换函数,我们可以使用模版:

template这个是固定的,我们的尖括号里面的class是可以写typename的,也就是这两种都是可以的,而且后面的那个T也是可以换的,T就是一个形参,可以使用任何形参进行代替;

除此之外,我们还需要提供一个函数,这样告诉编译器函数的样子,只有提供一个函数编译器才可以根据这个函数套出其他的函数,这样的话,我们相当于有了一个模版,比一起就是利用我们提供的这个模版写出其他的数据类型交换的函数;

编译器根据我们提供的模版进行实例化的操作。

(3)类模版

我们使用栈这个数据结构来介绍一下类模版

在这个栈里面,我们写了一个析构函数和一个构造函数,我们还写了一个push函数用来插入数据

为什么一定要有类模版,因为他可以解决一类问题,哪类问题呢?就是当你想要创建两个栈,一个栈的数据类型是int类型。一个栈的数据类型是double类型的,这个时候你怎么办?当只需要创建一个栈的时候,使用typedef想怎么搞就怎么搞,但是当让你创建2个栈而且栈的数据类型是不一样的时候,你是没有办法解决的,你必须把这个stack里面的代码写两遍,一个写上typedef int datatype一个写上typedef double datatype这样才能满足这两种数据类型的栈;

我们可以使用模版去解决这个问题,代码如下:

现在我们把所有的datatype全部换为T,但是这样还不够,编译器无法识别这个栈里面的数据类型,这个时候我们就需要在stack后面加上尖括号里面标明数据的类型,这个就是一个类模版;

(4)类型的不匹配问题

我们这里在调用函数的时候,就传递进去两个不同的数据类型的数值,这个时候对于模版,编译器不知道应该使用那种数据类型;

我们有两种解决的方案,第一种就是在我们想要转换的数据前面进行强制类型转换;

                                                                -----------------强制类型转换

第二种就是在add函数后面加上尖括号,括号里面的数据类型就是模版使用的数据类型;

                                                                -----------------显示实例化

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

漫谈ApplicationContext和BeanFactory的区别

各位大佬光临寒舍,希望各位能赏脸给个三连,谢谢各位大佬了!!! 目录 1.背景介绍 2.细述ApplicationContext和BeanFactory 3.总结 1.背景介绍 当我们使用SpringBoot创建项目的时候会看到一串代码&#xff1a…

全面理解BDD(行为驱动开发):转变思维方式,提升软件质量

在传统的软件开发流程中,开发人员和测试人员的工作通常是相互独立的。开发人员负责编写代码,测试人员负责找出代码中的问题。然而,这种方法可能导致沟通不足,而且会浪费时间和资源。为了解决这些问题,出现了一种新的开…

Linux cmake 初窥【3】

1.开发背景 基于上一篇的基础上,已经实现了多个源文件路径调用,但是没有库的实现 2.开发需求 基于 cmake 的动态库和静态库的调用 3.开发环境 ubuntu 20.04 cmake-3.23.1 4.实现步骤 4.1 准备源码文件 基于上个试验的基础上,增加了动态库…

电文加密(C语言)

一、题目说明&#xff1b; 即第1个字母变成第26个字母&#xff0c;第i个字母变成第(26 - i 1)个字母&#xff0c;非字母字符不变。 二、N-S流程图&#xff1b; 三、运行结果&#xff1b; 四、源代码&#xff1b; # define _CRT_SECURE_NO_WARNINGS # include <stdio.h&g…

过拟合和欠拟合的学习

1.什么拟合 就是说这个曲线能不能很好地描述某些样本数据&#xff0c;并且拥有较好的泛化能力。 2.什么是过拟合 过拟合就是曲线太过于贴切训练数据的特征了&#xff0c;在训练集上表现得非常优秀&#xff0c;近乎完美的预测/区分了所有得数据&#xff0c;但是在新的测试集上…

LeetCode—用队列实现栈

一.题目 二.思路 1.后入先出的实现&#xff1a; 创建两个队列来实现栈&#xff08;后入先出&#xff09;&#xff1a; 两个队列&#xff0c;保持一个存数据&#xff0c;另一个为空&#xff0c;入数据&#xff08;push&#xff09;要入不为空的队列&#xff0c;&#xff08;p…

Linux基础之进程的基本概念

目录 一、进程的基本概念 1.1 什么是进程 1.2 PCB的概念 1.3 进程的查看 1.3.1 查看进程方式一 1.3.2 查看进程的方式二 1.4 父进程与子进程 一、进程的基本概念 1.1 什么是进程 进程是什么&#xff1f; 课本概念&#xff1a;程序的一个执行实例&#xff0c;正在执行的…

Linux学习笔记8---官方 SDK 移植实验

在上一章中&#xff0c;我们参考 ST 官方给 STM32 编写的 stm32f10x.h 来自行编写 I.MX6U 的寄存器定义文件。自己编写这些寄存器定义不仅费时费力&#xff0c;没有任何意义&#xff0c;而且很容易写错&#xff0c;幸好NXP 官方为 I.MX6ULL 编写了 SDK 包&#xff0c;在 SDK 包…

基于springboot+vue+Mysql的校园闲置物品租售系统

开发语言&#xff1a;Java框架&#xff1a;springbootJDK版本&#xff1a;JDK1.8服务器&#xff1a;tomcat7数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09;数据库工具&#xff1a;Navicat11开发软件&#xff1a;eclipse/myeclipse/ideaMaven包&#xff1a;…

C++小程序:同一路由器下两台计算机间简单通信(2/2)——客户端

客户端的程序结构前半部分与服务器端基本相同&#xff0c;后半部分也相对简单。相关函数的解释可以参考前文服务器端的内容。有关客户端的内容除个别地方外&#xff0c;就不再做长篇大论的解释。强调一点&#xff0c;如果将此程序移到其它电脑上运行&#xff0c;编译需要releas…

Linux网络编程】传输层中的TCP和UDP(UDP篇)

【Linux网络编程】传输层中的TCP和UDP&#xff08;UDP篇&#xff09; 目录 【Linux网络编程】传输层中的TCP和UDP&#xff08;UDP篇&#xff09;传输层再谈端口端口号范围划分认识知名端口号netstatiostatpidofxargs UDP协议UDP协议端格式UDP的特点面向数据报UDP的缓冲数据UDP使…

20-LINUX--网络编程

一. 主机字节序列和网络字节序列 主机字节序列分为大端字节序和小端字节序&#xff0c;不同的主机采用的字节序列可能不同。大 端字节序是指一个整数的高位字节存储在内存的低地址处&#xff0c;低位字节存储在内存的高地址 处。小端字节序则是指整数的高位字节存储在内存的高…

CentOS 8.5 安装配置 Tinyproxy 轻量代理服务器 Windows10 系统设置http代理 详细教程

1 下载 下载地址 2 上传服务器并解压 tar zxvf tinyproxy-1.11.2.tar.gz 3 安装配置 #安装依赖软件 yum install automake cd tinyproxy-1.11.2/ #生成configure ./autogen.sh # ./configure --prefix/usr/local/tinyproxy make make install 4 配置环境 vim /etc/prof…

四川汇昌联信:拼多多运营属于什么行业?

拼多多运营属于什么行业?这个问题看似简单&#xff0c;实则涉及到了电商行业的深层次理解。拼多多运营&#xff0c;顾名思义&#xff0c;就是在拼多多这个电商平台上进行商品销售、推广、客户服务等一系列活动。那么&#xff0c;这个行业具体包含哪些内容呢?下面就从四个不同…

【计算机毕业设计】用于日语词汇学习的微信小程SSM

日语词汇学习小程序是高校人才培养计划的重要 组成部分&#xff0c;是实现人才培养目标、培养学生科研能力与创新思维、检验学生综合素质与实践能力的重要手段与综合性实践教学环节。本学生所在学院多采用半手工管理日语词汇学习小程序的方式&#xff0c;所以有必要开发日语词汇…

深度学习--DCGAN

代码之后的注释和GAN的一样&#xff0c;大家如果已经掌握GAN&#xff0c;可以忽略掉哦&#xff01;&#xff01;&#xff01; 在学习DCGAN之前&#xff0c;我们要先掌握GAN&#xff0c;深度学习--生成对抗网络GAN-CSDN博客 这篇博客讲的就是GAN的相关知识&#xff0c;还是很详…

吃掉 N 个橘子的最少天数

代码实现&#xff1a; 方法一&#xff1a;递归——超时 #define min(a, b) ((a) > (b) ? (b) : (a))int minDays(int n) {if (n 1 || n 2) {return n;}if (n % 3 0) {if (n % 2 0) {return min(min(minDays(n - 1), minDays(n / 2)), minDays(n - 2 * (n / 3))) 1;} e…

引擎:主程渲染

一、引擎发展 二、引擎使用 1.游戏渲染流程 2.3D场景编辑器操作与快捷键 3.节点的脚本组件 脚本介绍 引擎执行流程 物体节点、声音组件\物理组件\UI组件、脚本组件 暴露变量到面板 4.节点的查找 基本查找 this.node&#xff1a;挂载当前脚本的节点A&#xff1b; this.nod…

echarts环形图 legend文字过长显示...鼠标移动上展示全称

legend: {type: scroll,orient: vertical,x: left,y: bottom,top: "42%",left: 13%,data: this.dutyNames,textStyle: { color: #fff },triggerEvent: true,tooltip: {show: true,trigger: item,//鼠标移动上去展示全称},formatter: function (params) {var val &qu…

【每日刷题】Day38

【每日刷题】Day38 &#x1f955;个人主页&#xff1a;开敲&#x1f349; &#x1f525;所属专栏&#xff1a;每日刷题&#x1f34d; &#x1f33c;文章目录&#x1f33c; 1. 2696. 删除子串后的字符串最小长度 - 力扣&#xff08;LeetCode&#xff09; 2. LCR 123. 图书整理…