Yuk*_*awa 26 c android-source android-binder
我对"强指针"和"弱指针"的概念感到困惑.Diane Hackborn自己说:
当有强大的指针时,物体将保持在周围; 一旦最后一个被释放它就会被销毁.使用弱指针可以做的就是比较并试图提升为强指针; 如果对象上没有其他强指针,后者将失败.
这对我来说还不太清楚.强指针是否等同于a(boost::)共享指针?弱指针的作用是什么,只是为了试图将自己推向强指针?比如,我们什么时候需要弱点和强点?
更新:
谢谢大家,但我专门询问有关Android的内核sp和wp,和他们无关,在所有的Java引用.
基本上我试图破解这里的代码http://www.androidenea.com/2010/03/share-memory-using-ashmem-and-binder-in.html
并不真正理解使用sp和wp
更新:
实际答案在于接受答案的评论.感谢Gabe Sechan:
强指针和弱指针是不同的智能指针实现,并且做同样的事情 - 当指针超出范围时,只要至少一个强指针引用它,它就不会被释放.如果只有弱指针(或没有)引用它.每当对其进行强或弱引用时,都会进行检查.
如果我有10个弱引用引用相同的对象,并且其中一个超出范围,该对象将被销毁?虽然有强指针,但只有当它们全部10个超出范围时才会销毁对象?
是的,差不多.如果你只有10个弱指针,当最后一个强指针超出范围时,它可能已经超出了范围.如果有剩余内存,实现可能会允许它延长一点时间,但如果你进入低内存条件它将被切断,并且听起来不像它的实现是从她的引用提前.并且使用它仍然主要是缓存 - 它大致相当于boost shared_ptr和boost weak_ptr.所以基本上,弱指针可以让它引用的对象随时消失.
Sta*_*kER 31
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;
}
Run Code Online (Sandbox Code Playgroud)
如果创建强指针sp<IBinder> strongPointer,则m_ptr是引用的对象.正如您在源代码中看到的那样,sp模板只表示一个强指针,因此只要我持有此sp,系统就不会释放内存.它没有维护参考计数器.计数器在RefBase类中维护.并且为了使用StrongPointer,你的obj需要是RefBase的一个实例.
RefBase类维护强引用计数器和弱引用计数器,唯一的区别是如果强计数为0,则引用的对象将被释放.此外,对于由Refbase管理的对象,它可能同时被一些强指针和弱指针引用.
您可以在Android框架中看到StrongPointers的广泛使用,其中大部分都在IBinder对象上,本机绑定器对象可以通过不同的进程传递.不同的进程可以保存指向同一对象的强指针,只要一个进程仍然保持指针,该对象就不会被系统撤销.
Gab*_*han 12
Android应该用Java而不是C编程.来自Android团队的任何文档都会引用该语言.在Java中有强弱参考.弱引用不会阻止垃圾收集器清理它,强大的参考确实如此.它们用于某些操作系统上的缓存,但在Android 3.0版本中只保留对对象的弱引用意味着它将立即被收集.
C没有等效的弱引用,因为它没有垃圾收集.