什么是强指针和弱指针

时间:2013-03-18 20:49:50

标签: c android-source android-binder

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

  

当有强大的指针时,物体将保持在周围;它是   一旦最后一个被释放就被摧毁。你只能做一个弱者   指针是比较并试图提升为强指针;   如果没有其他强有力的指针,后者将失败   对象

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

更新

谢谢大家,但我具体询问了android的内核spwp,它们与Java的引用完全无关。

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

的用法

更新

实际答案在于接受答案的评论。感谢Gabe Sechan:

  

强指针和弱指针是不同的智能指针实现   做同样的事情 - 当指针超出范围时,这么久   因为至少有一个强指针引用它,它将不会被释放。如果   只有弱指针(或没有)引用它。检查是   每当对它的强或弱引用进行描述时就会完成。

     

如果我有10个弱引用引用同一个对象,而其中一个   那10个超出范围,对象将被销毁?而与   强大的指针,只有当它们全部10个超出范围时才会出现   对象被破坏了?

     

是的,差不多。如果你只有10个弱指针,那很可能   当最后一个强指针熄灭时,已经超出了范围   范围。实施可能会让它坚持一点   如果有多余的记忆,则会更长,但如果你去,它会被切断   进入低记忆状态,听起来不像他们的   实施是从她的报价中提出的。而这个用途就是   仍然主要是缓存 - 它大致相当于一个提升shared_ptr   并提升weak_ptr。所以基本上,弱指针可以拥有该对象   它的引用随时都会消失。

3 个答案:

答案 0 :(得分: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;
}

如果按sp<IBinder> strongPointer创建强指针,则m_ptr是引用的对象。正如您在源代码中看到的那样,sp模板只表示一个强指针,因此只要我持有此sp,系统就不会释放内存。它没有维护参考计数器。该计数器保持在RefBase级。并且为了使用StrongPointer,你的obj需要是RefBase的一个实例。

RefBase类维护强引用计数器和弱引用计数器,唯一的区别是如果强计数为0,则引用的对象将被释放。此外,对于由Refbase管理的对象,它可能被一些强指针和弱引用同时指针。

你可以在Android框架中看到StrongPointers的广泛使用,其中大多数是在IBinder对象上,本机的binder对象可以通过不同的进程传递。不同的进程可以保存指向同一对象的强指针,只要一个进程仍然保持指针,该对象就不会被系统撤销。

答案 1 :(得分:11)

Android应该用Java而不是C编程。来自Android团队的任何文档都会引用该语言。在Java中有强弱参考。弱引用不会阻止垃圾收集器清理它,强大的参考确实如此。它们用于某些操作系统上的缓存,但在Android 3.0版本中只保留对对象的弱引用意味着它将立即被收集。

C没有等效的弱引用,因为它没有垃圾收集。

答案 2 :(得分:3)

这是一篇很好的帖子,讨论Java中常规引用(或“StrongReference”),SoftReferenceWeakReference和甚至PhantomReference之间的区别,享受: http://weblogs.java.net/blog/2006/05/04/understanding-weak-references