什么是强指针和弱指针

Yuk*_*awa 26 c android-source android-binder

我对"强指针"和"弱指针"的概念感到困惑.Diane Hackborn自己说:

当有强大的指针时,物体将保持在周围; 一旦最后一个被释放它就会被销毁.使用弱指针可以做的就是比较并试图提升为强指针; 如果对象上没有其他强指针,后者将失败.

这对我来说还不太清楚.强指针是否等同于a(boost::)共享指针?弱指针的作用是什么,只是为了试图将自己推向强指针?比如,我们什么时候需要弱点和强点?

更新:

谢谢大家,但我专门询问有关Android的内核spwp,和他们无关,在所有的Java引用.

基本上我试图破解这里的代码http://www.androidenea.com/2010/03/share-memory-using-ashmem-and-binder-in.html 并不真正理解使用spwp

更新:

实际答案在于接受答案的评论.感谢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没有等效的弱引用,因为它没有垃圾收集.

  • 是的,差不多.如果你只有10个弱指针,当最后一个强指针超出范围时,它可能已经超出了范围.如果有剩余内存,实现可能会允许它延长一点时间,但如果你进入低内存条件它将被切断,并且听起来不像它的实现是从她的引用提前.并且使用它仍然主要是缓存 - 它大致相当于boost shared_ptr和boost weak_ptr.所以基本上,弱指针可以让它引用的对象随时消失. (7认同)
  • 好的,你应该告诉我们 - 不到.1%的人提出Android问题正在研究AOSP,他们指的是用户级别的android.所以,是的,强指针和弱指针是不同的智能指针实现并做同样的事情 - 当指针超出范围时,只要至少一个强指针引用它,它就不会被释放.如果只有弱指针(或没有)引用它.每当对其进行强或弱引用时,都会进行检查. (6认同)
  • 那你就不应该对弱或强引用感兴趣:-) (5认同)
  • 实际上我正在编程android的内核所以没有Java,无论如何,谢谢. (4认同)
  • @crazyfffan我想我们都误解了你的问题.强引用和弱引用仅与Java相关.与内核没有任何关系.你可以在你的内核上运行Pasvasicoboltran编程的ACME Corps Best Ever Mobile操作系统,它没有任何区别.内核不了解用户土地. (4认同)