我对“强指针”和“弱指针”的概念感到困惑。黛安·哈克伯恩自己说:
当有强指针时,该对象将保持在周围;一旦释放最后一个指针,它就会被销毁。弱指针所能做的就是进行比较,并尝试将其提升到强指针;如果对象上没有其他强指针,则强指针将失败。
对我来说还不清楚。强指针是否等同于(boost::)共享指针?如果弱指针只是为了提升自己成为强指针,那么它的作用又是什么呢?比如,我们什么时候需要强壮的指针?
更新:
谢谢大家,但我专门问的是android的内核sp和wp,它们与wp的引用毫无关系。
基本上,我试图破解这里的代码,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。所以基本上,弱指针可以让它引用的对象在任何时候消失。
发布于 2013-03-18 20:52:27
Android是用Java编写的,而不是C。Android团队的任何文档都会引用这种语言。在Java中有强引用和弱引用。弱引用不会阻止垃圾收集器清除垃圾,强引用会阻止垃圾收集器清除垃圾。它们用于在某些OSes上进行缓存,但在Android3.0中,只保留对对象的弱引用意味着它将被立即收集。
C没有等效的弱引用,因为它没有垃圾收集。
发布于 2013-03-19 06:05:12
sp在Android中的意思是StrongPointer,如果引用计数等于0,则指定对象占用的内存将被释放。wp的意思是WeakPointer,所以如果我有一个弱指针,我不关心引用的对象是否是活动的。它可能用于某些缓存和比较场景。
首先,快速查看StrongPointer.h中的sp实现。
它只是一个用于引用计数的包装器。例如,
template<typename T> template<typename U>
sp<T>& sp<T>::operator = (U* other)
{
if (other) ((T*)other)->incStrong(this);
if (m_ptr) m_ptr->decStrong(this);
m_ptr = other;
return *this;
}如果通过sp<IBinder> strongPointer创建强指针,则m_ptr是引用对象。正如您在源代码中看到的,sp模板只表示一个强指针,因此只要我持有这个sp,系统就不会释放内存。它不维护一个参考计数器。计数器在RefBase类中维护。为了使用StrongPointer,您的obj需要是RefBase的一个实例。
RefBase类同时维护强引用计数器和弱引用计数器,唯一的区别是,如果强计数为0,则将释放引用对象。此外,对于由Refbase管理的对象,可以同时引用一些强指针和弱指针。
您可以看到StrongPointers在安卓框架中的广泛使用,其中大部分都在IBinder对象上,本地绑定对象可以通过不同的过程传递。不同的进程可以保存指向同一个对象的强指针,只要一个进程仍然持有指针,系统就不会撤销该对象。
发布于 2013-03-18 20:56:24
这是一篇很好的文章,讨论了常规引用(或"StrongReference“)、SoftReferences、WeakReferences甚至PhantomReferences在Java中的区别:http://weblogs.java.net/blog/2006/05/04/understanding-weak-references
https://stackoverflow.com/questions/15486676
复制相似问题