智能指针里弱引用应该如何实现?(WeakReference/WeakPtr<T>)
2015-08-20 16:16
501 查看
弱引用(指针)指的是这样一个概念:引用不控制对象的生命周期,但是对象本身销毁后,弱引用能得到“通知”。
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的实现思路(概念上的):(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种思路吧。
相关文章推荐
- DOM(一)-04-(DHTML概述)
- jquery Easyui快速开发总结
- javascript 闭包暴露句柄和命名冲突的解决方案
- 防微博内容展示,使用Html.fromHtml(),解决内容不能换行的问题
- MVC Newtonsoft.Json解析JSON字符串
- 极光 通过js函数
- JavaScript(二)-16-(JS自定义对象2)
- js中,从一段链接中获取ip地址的方法。
- js/jquery获取页面大小,滚动条位置,元素位置
- 初识JSONP--解决ajax跨域问题
- JavaScript(二)-15-(JS自定义对象)
- JavaScript(二)-14-(JS中的特有语句-forin)
- JS中的数据类型和变量内存
- JavaScript(二)-13-(全局方法&Number对象)
- CSS3:transition过渡效果
- JQuery 的选择器
- JavaScript(二)-11-(JS中特有语句-with)
- JavaScript(二)-12-(常见对象-Math-基本功能)
- JavaScript(二)-10-(常见对象-Date-基本方法)
- js很好的教材