《C++内存管理结尾和模板》

一】定位new表达式(placement-new)

关于这部分的内容大家了解就行,没必要去深究

使用格式:

这玩意本质上就是有一块已经开辟好的空间,然后去将这块空间同化为一个类,然后将这块空间当类使用。

tips:这是一个非常重要的点,如果内部构造函数有参数时,始化需要传参。

日常一问的部分:

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.free只会将这块内存空间释放,并不会完成这块空间的清理工作。

什么是内存泄漏?内存泄漏的危害?

什么是内存泄漏:内存泄漏是指因为疏忽或者错误造成程序未能释放已经不在使用的内存的情况,内存泄漏并不是指内存在物理上的消失,而是应用程序分配某段内存后,因为程序涉及错误,失去了对该段内存的控制,因而造成了内存的浪费。

内存泄漏的危害:长期运行的程序出现内存泄漏,影响很大,如操作系统,后台服务等等,如果出现内存泄漏会导致相应越来越慢,最终卡死。

如何检测内存泄漏呢?

在vs下,可以使用windows操作系统提供的_CrtDumpMemoryLeaks()函数进行简单的检测,但是这个函数只能报出漏了多少个字节,不能显示出其他具体的信息。

在不同的环境下都有不同的内存泄漏检测工具,这个大家以后都会学到

如何避免内存泄漏:

1.工程前期良好的涉及规范,养成良好了编码规范,申请的内存空间记得去匹配的释放。这只是理想的状态,但是如果碰上了异常时,就算注意释放了,也还会出现问题,也需要下一条智能指针来管理才有保障。

2.采用RAII思想或者只能指针来管理资源。

3.有些公司内部规范使用内部实现的私有内存管理库,这套库自带内存检测的功能选项

4.出问题了使用内存泄漏工具检测,ps:不要钱的不好用,好用的要收费。。。

【二】泛型编程

我们实现一个加法函数的时候会将不同的类型参数进行重载,从而让这个函数对不同类型的参数都能可以实现加法。但是这样写函数会出现很多不好的地方,比如:

1.重载的函数仅仅是类型的不同,代码重复的利用率比较低,只要有新的类型出现时,就需要维护自己增加对应的函数。

2.代码的可维护性比较低,一个出错可能所有的重载均出错。

这个时候就要出现一种概念叫做泛型编程了,也就是编写与类型无关的通用代码,是代码重复利用的一种手段,磨具是泛型编程的基础。

其实模板这个概念我们从日常生活中的概念都是可以推测出来的,无非就是给编译器一个模具,让编译器根据不同的材料生成不同的结果。

【三】函数模板

模板分为两种:函数模板和类模板

1.函数模板的概念

函数模板代表了一个函数家族,该函数模板与类型无关,在使用时被参数化,根据实参类型产生特定的类型版本。

2.函数模板格式

template<typename T1,typename T2........,typename Tn>

返回值类型  函数名  (参数列表){}

注意:typename是用来定义模板参数关键字,也可以使用class(切记不能使用struct代替class)

3.函数模板的原理

其实函数模板就是一个蓝图,它自己本省并不是函数,是编译器使用方式产生特定具体类型函数的摸具,所以其实就是将本来应该我们做的事情交给了编译器。

这也就出现了一个论调:懒人创造世界

在编译器阶段,对于模板函数的使用,编译器需要根据传入的实参类型来推演生成对应类型的函数以供调试。比如:当double类型使用函数模板时,编译器通过对实参类型的推演,将T确定为double类型,然后生成一份专门处理double类型的代码,对于字符类型也是如此。

4.函数模板的实例化

用不同类型的参数去使用函数模板参数时,称之为函数模板的实例化,模板参数实例化分为:隐式实例化和显示实例化。

a)隐式实例化:让编译器根据实参推演模板参数的实际类型

 这样编译就是不能通过的,因为模板参数只有一个参数,你将第一个参数初始化为int,那么第二个也就是int,而你传入的时double的参数,所以会报错

注意:在模板中,编译器一般不会进行类型转化的操作,因为一旦转化出问题,就会有人说这个编译器有问题。。。

所以这个时候就需要程序员自己动手来手动强制转化

这样就没问题了,这是程序员自己的手动转化,只要出问题就怪不到编译器了。。。

5.模板参数的匹配原则

一个非模板函数可以和一个同名的函数模板同时存在,而且该函数模板还可以被实例化为这个非模板函数。

其实编译器也是一个懒狗,如果你存在相应的函数,那么编译器就不会选择去推演出相应的函数版本,且模板函数不允许自动类型转化,但是普通函数可以进行自动类型转化。

【四】类模板

类模板最主要和函数模板不同的就是类模板中函数放在类外面进行定义,需要加模板参数列表

类模板实例化与函数模板实例化不同,类函数实例化需要在类模板名字后面跟上<>,然后将实例化的类型放在<>中即可,类模板名字不是真正的类,而实例化的结果才是真正的类。

 以上就是这期的全部内容了,还请大家一键三连,毕竟码字不易,如果觉得哪些有问题的地方还请移步评论区斧正。

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值