2013-03-18 374 views
20

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

对象将保持在有强指针的时候;一旦最后一个被释放,它就会被销毁 。你所能做的就是用一个弱指针 进行比较并试图将其提升为强指针; 如果 对象上没有其他强指针,则后者将失败。

这对我来说很不清楚。强指针相当于(boost::)共享指针吗?如果只是试图将自己提升为强大的指针,那么弱指针的作用是什么?就像,我们什么时候需要弱和强的指针?

更新:

谢谢大家,但我专门询问有关Android的内核spwp,他们什么都没有做与所有的Java引用。

基本上我想在这里破解密码http://www.androidenea.com/2010/03/share-memory-using-ashmem-and-binder-in.html 而并不真正了解使用spwp

更新:

实际的答案在于接受的意见回答。由于加布Sechan:

强弱指针是不同的智能指针实现 做差不多的东西─当指针超出范围,只要 至少一个强有力的指针引用它,它不会被释放。如果 只有弱指针(或没有)引用它。检查是 每当强或弱的引用被取消时完成。

如果我有10个弱指针引用相同的对象,并且其中一个 超出范围,对象将被销毁?鉴于 强烈的指针,只有当他们所有10个超出范围将 对象被摧毁?

是的,差不多。如果你所拥有的只有10个弱指针,那么当最后一个强指针去掉 的范围时,可能 已经超出了范围。如果有空闲的内存,执行可能允许它稍微延长一点 ,但是如果您将 转换为内存不足的状态,并且听起来不像它们的 实现是从她的报价中提高的那样,它将被切碎。而且这个的使用仍然主要是缓存 - 它大致相当于一个boost shared_ptr 并提升weak_ptr。所以基本上,一个弱指针可以让它随时引用的对象 消失。

+0

+1努力解释这个概念 – miller 2014-07-02 12:50:52

回答

7

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

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

+4

其实我编程android的内核,所以没有Java,谢谢。 – 2013-03-18 20:54:04

+5

然后你不应该对弱或强引用感兴趣:-) – fedepaol 2013-03-18 20:56:29

+0

@fedepaol击败了我... – Simon 2013-03-18 20:57:43

22

SP指StrongPointer在Android上,如果引用计数等于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对象上,本机绑定器对象可以通过不同的进程。不同的进程可以持有强指向同一对象的指针,只要一个进程仍然持有指针,该对象就不会被系统撤销。

+0

为什么'sp'类不像'std :: shared_pointer'那样维护引用计数?分解这样的责任有什么好处? – Adrian 2017-02-09 16:23:00

+0

这应该被标记为答案... – 2017-07-14 18:10:02