c++智能指针介绍_补充

发布时间:2020-12-26 发布网站:编程之家
编程之家收集整理的这篇文章主要介绍了c++智能指针介绍_补充编程之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

不明白我做错了什么,这几天老婆给我冷战了起来,也不给我开视频让我看娃了。。哎,心累!趁着今晚的一些空闲时间来对智能指针做个补充吧。

 

写完上篇“智能指针介绍”后,第二天上班途中时,突然一个疑问盘踞在心头,感觉上篇文章介绍的有些缺陷或者遗漏。

问题引入:当两个智能指针引用同一个heap obj,那么当一个智能指针跳出其scope时,另一个智能指针是怎么知道所引用heap obj的引用数量(use_count)现在变成了1?

                   如果引用计数是“智能指针类”内部的一个member var,那么其会随着该智能指针而消失,对吧?但是另一个智能指针所拥有的独立的引用计数(member var)不应该知道要减一才对啊!

 

Android如何实现?

抛出这个问题后,回顾下Android实现的智能指针(更准确说是强弱指针:StrongPoint/WeakPoint即sp/wp)使用方式:sp<XYZ> sp_obj = new XYZ();

安卓中的智能指针所引用的类都有一个要求:XYZ必须从RefBase继承而来,引用计数在基类RefBase中实现。

因此XYZ类对象被多个sp_obj_x所引用时,因为各个sp_obj_x都能访问和修改XYZ类内部的同一个引用计数器,因此可以容易知道什么时候真正释放这个XYZ类对象(heap obj)。

使用者只需sp<XYZ> sp_obj = new XYZ();构造这个对象,回收不用管了(不用手动delete),利用OS系统在函数堆栈调用切换来自动回收这块heap内存。

用机器去做事情我们可以放心,因为它不会犯错。相反,人做事情常常丢三落四。

 

答案介绍:

如果两个智能指针想知道彼此释放资源与否,那么这两个智能指针之间必须能够“互相通信”,因此内部的“引用计数”就不能被单个类共享!

如何让两个stack obj能够分享信息呢?除了共同引用的heap obj(如果其内部有个ref_cnt,也可以做到,类似与安卓的只能指针)外,只有那个“引用计数”了,其必须是动态内存!

也即是,当第一次引用资源(那个heap obj)时,也即第一个shared_ptr进行构造时,其除了一个内部变量保存这个堆指针外,还需new一块内存,这块内存用于引用计数管理(其内部的ref_cnt先加1);

当第二引用同一个资源时,即进行拷贝构造(shared_ptrconst shared_ptr& r ))时,其除了会引用共同的资源外,还会引用上次new出的那个内存块,并且将ref_cnt再加1,变成2。

这可以解释释放第一个智能指针后,第二个智能指针可以知道所管理的资源的引用数量了。

 

其它补充:

1.use_count()相当于sp的getStrongCount().

2.weak_ptr的lock()相当于wp的promote(),先获得资源所有权,再判断资源有效性。

3.get()都用于取得所管理的资源的地址。

4.reset()和=NULL(即operator =)都是解除该智能指针对资源的引用,但不一定真正释放资源(同时还被其他智能指针引用)。

5.都重载了->和*,用于访问其管理的资源。

 

就先说这么多吧,以后想起来了再补充。

 

              

总结

以上是编程之家为你收集整理的c++智能指针介绍_补充全部内容,希望文章能够帮你解决c++智能指针介绍_补充所遇到的程序开发问题。

如果觉得编程之家网站内容还不错,欢迎将编程之家网站推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您喜欢交流学习经验,点击链接加入编程之家官方QQ群:1065694478
编程之家官方公众号

微信公众号搜索 “ 程序精选 ” ,选择关注!

微信公众号搜索 “ 程序精选 ”
精选程序员所需精品干货内容!