C++初阶 内存管理和模板

CSDN 2024-06-11 13:35:03 阅读 65

目录

一、new

1.1什么是new?

1.2为什么要有new?

1.3使用new

1.4 new的超级好处

 二、delete

2.1什么是delete?

2.2为什么要有delete?

2.3使用delete

三、  malloc / free和new / delete的共同点和区别

四、浅谈模板

4.1什么是模板?

4.2函数模板的使用

4.3变量实例化

 4.4类模板


一、new

1.1什么是new?

C++在堆上开空间的操作为new,可以看作是C语言的malloc

1.2为什么要有new?

既然有了C语言的malloc那么为什么C++又要搞个new出来呢?功能不都一样吗,之所以要搞个new出来主要的原因还是自定义类型的定义,在C语言中我们要用malloc创建一个自定义类型的空间,不仅要用到强转,还得用到sizeof。非常的不方便,而new便可以解决这些不方便的地方

1.3使用new

使用new开辟空间有以下两种方式

1.new+类型  如new int便是直接开辟一个int大小的空间

2.new +类型+[n]  如new int[10]开辟10个int大小的空间

初始化也有两种方式

1.new int(n)  如new int(10)是开辟一个int大小的空间并将其初始化为10

2.new int[数字]{数个初始化变量} 如 new int[10]{1,2,3}是开辟十个int大小的空间,并将前三个区块初始化为1,2,3而没被初始化的区块则会被默认为0

通过监视窗口可以验证上述几点

1.4 new的超级好处

前面我们说过new可以针对自定义类型,接下来就让我们来试一下

不难看出,使用C语言的malloc来开辟空间不仅代码不简洁而且还没法初始化,而C++的new不仅可以开辟空间,而且可以通过类的构造函数对对象进行初始化,一步到位。

这时候就有小伙伴问了,你这个初始化只初始化一个变量的类,不是很捞吗,其实多个变量一样可以初始化,使用()中间加逗号作为分隔

 二、delete

2.1什么是delete?

可等价为C语言中的free,用来释放在堆上开辟的空间的

2.2为什么要有delete?

为了和new配套使用,同样也是为了处理自定义类型,delete的超级好处便是自定义类型走完它的生命周期后会走它的析构函数对变量进行处理

2.3使用delete

1.用new+类型 这种方式创建出来的空间,直接delete+空间首地址即可

2.用new+类型+[n] 这种方式创建出来的空间,得delete[]+空间首地址

不匹配使用的话程序可能会崩溃

可以看出,delete会调用对应类的析构函数

三、  malloc / free和new / delete的共同点和区别

malloc / free和new / delete的共同点是:都是从堆上申请空间,并且需要用户手动释放。不同的地

方是:

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在释放空间前会调用析构函数完成

空间中资源的清理

四、浅谈模板

4.1什么是模板?

在生活中我们常常能遇到什么万用作文模板,用固定的句式加上几个词汇的那种大家应该都见过,而我接下来我们谈的模板也和这个有异曲同工之处,都是套一套固定的模式。模板分为函数模板和类模板这两种模板。

4.2函数模板的使用

函数模板其实就是在函数的前面加上一行template<typename 变量>其中typename可以拿class来代替,它们二者有一点小区别之后我们会谈到,现在就把它俩看作等价的即可

在生活中我们经常会使用到交换函数,但是交换函数往往会涉及到不同的变量,这就令人沮丧,因为这意味着我们得根据不同的变量来因地制宜地写函数,而模板的出现便杜绝了这一情况,一个swap便可以代表所有

4.3变量实例化

函数名和参数中间写<类型>,为显示实例化,如此不需要编译器来推理类型,直接就出来了

如下:

 4.4类模板

类模板实例化与函数模板实例化不同,类模板实例化需要在类模板名字后跟<>,然后将实例化的类型放在<>中即可,类模板名字不是真正的类,而实例化的结果才是真正的类,因此不难看出它的用途,以前我们写栈得搞个typedef int StackType 现在不再需要,直接上就能够有所有类型的栈

 



声明

本文内容仅代表作者观点,或转载于其他网站,本站不以此文作为商业用途
如有涉及侵权,请联系本站进行删除
转载本站原创文章,请注明来源及作者。