5

boost::weak_ptrが定義されているためoperator<、連想コンテナで使用できます。

私の質問は次のとおりです。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
  • アサート #1 が true の場合、アサート #2 は常に true を保持しますか?
  • Scope1wptrA2の前後で同じ状態ですか?
4

3 に答える 3

5

の現在の実装ではboost::weak_ptroperator<ポインタを内部参照カウント追跡構造と比較します。この構造は、すべての強参照と弱operator<参照が削除されるまで解放されないため、強参照がないためにポイント先のユーザー データが解放された場合でも、安全に使用できます。

于 2011-01-21T18:06:34.370 に答える
2

ここでweak_ptrの比較について読んでください。

于 2011-01-21T18:08:15.977 に答える
1

std::owner_lessを使用します。これは、ポインター自体ではなく、使用カウントのポインターを比較します。例えば:

typedef std::weak_ptr<int> IntWPtr;
std::set<IntWPtr, std::owner_less<IntWPtr> > m_set;
于 2011-05-19T23:19:58.480 に答える