2013-03-18 377 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