0

私はweak_ptrのソートされたベクトルを検索するためにlower_bound()を使用しています

vector<weak_ptr<A> >::iterator findA( const string & id ) const
{
    sa = make_shared<A>( id );
    a = sa;
    return lower_bound( owners.begin(), owners.end(), sa,
            [] ( const weak_ptr<A> & l, const weak_ptr<A> & r ) 
                {
                    return (l.lock()->getID() < r.lock()->getID());
                } );
}

はどこsaにありshared_ptr<A>、クラスAにはプライベートstring IDメソッドとパブリック メソッドがありgetIDます。findA呼び出すと、セグメンテーション違反が発生しgetIDます。が原因だと思いますがlock()、これは empty を再実行しますshared_ptr

どうすれば修正できますか?

4

1 に答える 1

1

値が決定論的ではない要素をソートすることはできません (そして、weak_ptr に格納された値は決定論的ではありません)。したがって、ベクトルがソートされていることを知る方法はありません。

ソートされていることがわかっている場合 (オブジェクトは、lower_bound を呼び出している同じスレッドでのみ存在しなくなるため)、次のことを確認する必要があります。

  1. ベクトルは、すべての空の weak_ptr がすべての空でないものよりも小さくなるように並べ替えられます。
  2. すべての空のweak_ptrが互いに小さくないこと。
  3. ベクトルのソートと lower_bound 関数の両方に同じコンパレータが使用されます。

lower_bound の呼び出しの前後で要素の順序が (上記のコンパレータの下で) 同じままであることを保証できない場合は、lower_bound を使用できません。

言い換えれば、lockが空のポインターを返すという事実を回避するには、空のポインターをチェックしてコンパレーターで適切に処理する必要がありますが、オブジェクトが別のスレッドで消えている場合はそうすべきではありません (なぜなら、あなたの注文は決定論的ではありません)。

于 2015-04-06T01:53:31.417 に答える