2011-01-21 54 views
5

對於boost::weak_ptroperator<已定義,因此它可用於關聯容器中。到期後boost :: weak_ptr的排序順序?

我的問題是:幾個weak_ptr對象的排序順序是否穩定,即使它們中的一些更改爲零計數?這不是像std::set這樣的容器嗎?

例子:

using namespace boost; 
shared_ptr<A> sptrA1(new A); 
weak_ptr<A> wptrA1 = sptrA1; 
weak_ptr<A> wptrA2; 

{ // begin Scope 1 
    shared_ptr<A> sptrA2(new A); 
    wptrA2 = sptrA2; 
    assert(wptrA1 < wptrA2); // assert #1 
} 
assert(wptrA1 < wptrA2); // assert #2 
  • 將斷言#2始終保持爲真,如果斷言#1是真的嗎?
  • wptrA2在範圍1之前和之後處於相同狀態?

回答

5

boost::weak_ptr的當前實現中,operator<比較指向內部引用計數跟蹤結構的指針。除非所有強和弱引用都被刪除,否則此結構不會被釋放,因此即使由於缺少強引用而釋放指向用戶數據,也可以安全使用operator<

+0

有趣。我對http://www.boost.org/doc/libs/1_43_0/libs/smart_ptr/weak_ptr.htm中的use_count文檔感到困惑。它聲明「返回:0,如果*這是空的」,然而根據你的回答相反(*這是空的,如果它返回0)是不正確的,對嗎? (如果empty被定義爲從默認構造weak_ptr獲得的狀態) – 2011-01-21 18:22:03

+0

我還沒有對這裏的'use_count`做什麼聲明:)也就是說,內部引用計數結構保留兩個計數 - 一個僅用於強引用(當它達到零時,被指向的對象被銷燬),一個包含強和弱引用(當它達到零時,引用計數結構被銷燬)。 `use_count`函數可能只查看強計數的函數,但我沒有調查過,所以請自行驗證。 :) – bdonlan 2011-01-21 19:19:07

2

閱讀關於weak_ptr比較here

+0

有趣的閱讀。不是一個微不足道的問題。 – 2011-01-21 18:20:07

1

使用std :: owner_less。這比較使用計數的指針,而不是指針本身。例如:

typedef std::weak_ptr<int> IntWPtr; 
std::set<IntWPtr, std::owner_less<IntWPtr> > m_set;