目录
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函数后面加上尖括号,括号里面的数据类型就是模版使用的数据类型;
-----------------显示实例化