智能指针里弱引用应该如何实现?(WeakReference/WeakPtr<T>)

来源:互联网 发布:微信外卖系统源码 编辑:程序博客网 时间:2024/04/30 13:10

弱引用(指针)指的是这样一个概念:引用不控制对象的生命周期,但是对象本身销毁后,弱引用能得到“通知”。


 WeakPtr的实现思路(概念上的):(WeakPtr 1)===> (引用结构 2) <==> (实际的对象 3)
当(实际的对象3)由于调用析构函数销毁自己时,可以清除(引用结构 2)里面的信息,这样(WeakPtr 1)就得到了null,相当于被通知到了

一种可能的实现:让WeakPtr作为一个全局WeakHashMap中的item成员,每当一个对象T创建时,即以对象的id(对于Java)或者其地址(对于C++)作为WeakHashMap作为key,同时hook住对象的析构函数,当对象销毁时,从这个WeakHashMap移除此item即可。这里的场景有点像日本公司职员上班时需要往墙上挂一个木牌代表他当前在办公室里一样。

但是这个实现感觉哪里不对劲:假设实际对象3销毁后,创建一个新的对象4,4恰巧重新维护了原来2<==>3的双向引用,这种情况下,WeakPtr 1会误认为对象3实际上未被销毁,可以把这种问题称之为“名字盗用”。
所以我真的感觉不对劲:WeakPtr到底是如何实现的?

嗯,想到了一种新的可能的WeakPtr实现:让WeakPtr<T>的弱引用对象形成一个循环链表,而T的成员数据中有一个WeakPtr<T>*成员,初始为空,当第一个指向对象T的WeakPtr<T>被创建时,此成员有赋值。
假设初始弱引用a1指向A对象,其后增加了一个新的弱引用a2,然后删除a1,此时A对象中的此WeakPtr<T>*成员应该指向a2。

嗯,有时间应该看看C++ 11标准库是weak_ptr到底是怎么实现的,好像它是与shared_ptr相互关联的。但是从基本概念上,应该不会脱出我之前想到的这2种思路吧。



更正:WeakPtr不是这么实现的,RefPtr需要(PtrPtr 1)===> (引用结构 2) <==> (实际的对象 3)这样的概念连接,并且2实际上由于WebKit的RefCountedBase基类模板,与3共用一块内存。


WeakPtr的实现恰恰相反:(WeakPtr 1)===>  (实际的对象3,这里最关键的trick是一个WeakPtrFactory工厂对象作为实际对象的最后一个成员<===>(弱引用结构2) 

(弱引用结构2) 实际上是每个原始对象仅关联一个堆上的new内存,里面保存的就是对象本身的地址。——也就是说,把对象本身的地址存储到此对象关联的另外一个独立的堆内存数据结构里。

0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 苹果6plus玩王者荣耀卡怎么办 华为荣耀3c的手机内存不足怎么办 红米4x玩王者荣耀卡怎么办 华为手机荣耀10一直重启怎么办 荣耀9青春版老自动重启怎么办 手机开不开机停在华为界面怎么办 华为荣耀9老是反复的重启怎么办 华为荣耀4x老是反复的重启怎么办 手机更新系统后开不了机怎么办 荣耀畅玩7x没有4g网络怎么办 华为4x数字解锁不对中怎么办 华为手机需要解锁后才能刷机怎么办 畅玩6x锁屏壁纸黑了怎么办 指纹密码解锁的手机解不开了怎么办 客户说物流太慢了要退货怎么办 天猫买的手机商家不给发票怎么办 天猫超市下单付款后缺货怎么办 淘宝卖家填写假的单号不发货怎么办 天猫商家72小时未发货怎么办 天猫精灵方糖不按顺序播放怎么办 在天猫购物已付款不发货怎么办 淘宝退货商家收到货不退款怎么办 被有实名认证的闲鱼卖家骗了怎么办 我收到了方正的提示函怎么办 淘宝刷q币单被骗了怎么办 中通快递已签收但是东西丢了怎么办 手机不版本低不支持微信下载怎么办 淘宝虚拟商品不支持7天退货怎么办 卖虚拟物品遇到恶意退款买家怎么办 淘宝极速退款后卖家拒绝退款怎么办 我的天猫积分不让换券了怎么办 微信手机话费充错了怎么办 自己进货在淘宝卖被投诉假货怎么办 京东买的电器售后后服务差怎么办 京东到家申请退款卖家不处理怎么办 天猫买了假货商品下架了怎么办 淘宝本地生活服务不能入驻了怎么办 淘宝店铺名在电脑上搜索不到怎么办 已经将退货寄回店家硬说没有怎么办 微信申诉账号短信验证失败怎么办 京东账号换手机号收不到短信怎么办