推荐关注个人博客 https://www.smiletoyou.cn大家都知道,学习C语言,指针很很重要的一部分,那么为什么在C11中还会出现智能指针的概念呢,我们都知道C11是将以前C99的知识进行了更加深入的改变,让C用起来更加的方便,而且它还创建了许多新的类型,比如我们这次要探讨的智能指针就是在C11里面新出的一个内容。叹气智能指针,我们不得不说一下线程安全问题,所谓的线程安全问题就是你在多线程并发运行的时候不会发生结果的交互与错乱,而是仅仅按照自己原有的步伐进行运行,最后得到结果,这就是所谓的线程安全,不会因为别人的干扰而达到错乱。判断一个线程是不是线程安全,首先得看它是不是满足竞态条件(随着线程调度顺序的不同,代码得到不同的结果),在看它是不是临界区代码,再看它是否是原子操作,如果不是,则就不是线程安全的。那么要解决是否是线程安全的有效方法就是给其加互斥锁,在进程进来的时候我们通过判断它是否存在或者正在运行当中来进行相应的加解锁操作。一扯又扯远了,稍微拓展一下知识,接下来我们继续来看智能指针:首先系统提供的智能指针是一个线程安全。
智能指针有两种分类:
1.不带引用计数的智能指针
auto_ptr
unique_ptr
scoped_ptr
2.带引用计数的智能指针
shared_ptr(强智能指针)
weak_ptr(弱智能指针)
其中我们最主要用的就是带引用技术的智能指针,因为它的引用计数可以方便我们对函数进行适当时间的析构,避免发生没存泄露问题(说起这个内存泄漏问题,前几天有一个面阿里的同学就被问道了这个内存泄漏问题,面试官问你可以如何在widowns上进行内存泄露的快速定位。。。。。。。。呃,本来不想告诉你们答案的,不过好奇心有趋势我写了 出来,那行吧,给你们说几种方法:1.可以在VS调到DEBUG版本,然后利用它自身的宏 _CrtDumpMemoryLeaks就可以再运行结果出爆出内存泄漏的大概地方 2.有一个插件吧,它是专门用来检测内存泄漏的,你们可以去下载一下 VISUAL LEAK PETECTOR(VLD),就是这个软件,然后你在后面每次写代码之前包含一下它的头文件,这样的话运行过程中要是有内存泄露问题,它在结果显示部分会给你清楚的显示出泄露了多少字节,泄露的准确行数再哪里,总之用起来很方便。对了,关于如何去判断内存泄漏我也说出一种方法吧,其实真正的内存泄漏并不是说你malloc,new了以后没有free,delete,要是你觉得这个就算是内存泄露的真正含义的话,那你就是个外行,真正的内存泄漏是指在系统运行的期间,某种原因会一直损耗其内存,直到其消耗至空为止,这才是真正的内存泄漏,所以说我们可以打开其任务管理器区查看其没存使用情况和虚拟内存空间的占用率,要是不停的再增长的话,那肯定就内存泄露了。)
对于智能指针早成的困扰,我想你应该也知道,就是智能指针的交叉引用,那么如何解决呢,其实很简单,就是奖两个中的一个改成weak_ptr就行啦,毕竟weak_ptr它是依赖于shared_ptr存活的。
其他的也就没什么了,原理给你们讲清楚了,代码你们自己写。代码的实现将指日可待。