我对“强指针”和“弱指针”的概念感到困惑。Diane Hackborn本人曾说过:“只要有强指针,对象就会一直存在;当最后一个强指针被释放时,对象就被销毁了。弱指针只能进行比较并尝试升级为强指针;如果对象上没有其他强指针,则后者将失败。”这对我来说相当不清楚。强指针是否等同于(
更新:感谢大家的回答,但我特别询问的是安卓内核中的
基本上我正在尝试破解这里的代码http://www.androidenea.com/2010/03/share-memory-using-ashmem-and-binder-in.html,但不太理解
强指针和弱指针是不同的智能指针实现,基本上做的事情相同-当指针超出范围时,只要至少有一个强指针引用它,它就不会被释放。如果只有弱指针(或没有任何内容)引用,则会被释放。检查是在强引用或弱引用解除作用域时进行的。
如果我有10个弱指针引用同一个对象,并且其中一个10个超出范围,对象将被销毁?而对于强指针,只有当所有10个都超出范围时,对象才会被销毁?
是的,几乎是这样。如果您只有10个弱指针,那么当最后一个强指针超出范围时,它很可能已经超出了范围。如果存在多余的内存,实现可能允许其继续存在一段时间,但如果进入低内存条件并且她的引用中没有高级实现,它将被删除。而使用这种方法仍然主要是缓存-它大致等同于boost shared_ptr和boost weak_ptr。因此,基本上,弱指针所引用的对象随时可能消失。
boost::
)shared pointer?如果弱指针只是为了尝试将自己提升为强指针,那它的作用是什么呢?也就是说,我们何时需要使用弱指针和强指针?更新:感谢大家的回答,但我特别询问的是安卓内核中的
sp
和wp
,它们与Java的引用完全无关。基本上我正在尝试破解这里的代码http://www.androidenea.com/2010/03/share-memory-using-ashmem-and-binder-in.html,但不太理解
sp
和wp
的用法。
更新:
实际答案在接受答案的评论中。感谢Gabe Sechan:强指针和弱指针是不同的智能指针实现,基本上做的事情相同-当指针超出范围时,只要至少有一个强指针引用它,它就不会被释放。如果只有弱指针(或没有任何内容)引用,则会被释放。检查是在强引用或弱引用解除作用域时进行的。
如果我有10个弱指针引用同一个对象,并且其中一个10个超出范围,对象将被销毁?而对于强指针,只有当所有10个都超出范围时,对象才会被销毁?
是的,几乎是这样。如果您只有10个弱指针,那么当最后一个强指针超出范围时,它很可能已经超出了范围。如果存在多余的内存,实现可能允许其继续存在一段时间,但如果进入低内存条件并且她的引用中没有高级实现,它将被删除。而使用这种方法仍然主要是缓存-它大致等同于boost shared_ptr和boost weak_ptr。因此,基本上,弱指针所引用的对象随时可能消失。