2014-07-16 44 views
4

創建shared_ptr時,它的管理器對象使用強引用計數器&。我明白,通過使用強引用計數器shared_ptr知道何時解除分配管理對象,但我不明白爲什麼它使用弱引用計數器。瞭解弱引用計數器

回答

5

存在與shared_ptr<T> & weak_ptr<T>相關聯的兩個對象:

  • 實際對象(T
  • 控制塊,包含共享和弱計數器

實際的對象將被銷燬,如果共享計數器達到0。但控制塊有活路,只要有共享弱指針,即控制塊將盡快既共享弱反0刪除。

+0

這是爲什麼這是必要的? – Tracer

+0

@Tracer:爲什麼'weak_ptr'是必需的?或者爲什麼需要'weak_ptr'的計數器? – nosid

+0

@Tracer假設它沒有像那樣工作。然後,'weak_ptr'如何知道指向的對象是否已被刪除? – hvd

1

weak_ptr用於需要處理有問題的堆對象的事情,但不希望聲明任何會阻止釋放對象的所有權。這種東西的一個典型示例是觀察者,他們想知道底層對象的任何更改,但不希望在沒有其他人使用該對象時將其保留。

3

弱指針和強指針都包含指向數據的指針和指向引用計數塊的指針。

當您嘗試將弱指針轉換爲強指針時,會添加新的強計數。如果它從0增加,你知道數據已經被破壞,所以你失敗了。這需要訪問引用計數塊。

因此,引用計數塊的生命週期必須超過所有未完成的弱指針的生存期。

這可以通過引用計數引用計數塊的引用計數來確保。當引用計數減少到零時,最後一個未完成的強或弱引用超出範圍,導致智能指針銷燬引用計數塊。