矢量weak_ptr,lock()。下限。段错误

时间:2015-04-05 20:44:21

标签: c++ weak-ptr lower-bound

我使用lower_bound()搜索weak_ptr的排序向量

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());
                } );
}

sashared_ptr<A>A类有私有string ID和公共方法getIDfindA调用getID时会导致段错误。我想这是因为lock(),它会重新空shared_ptr

我该如何解决?

1 个答案:

答案 0 :(得分:1)

您不能对值不确定的元素进行排序(存储在weak_ptr中的值不是确定性的)。所以你无法知道向量是如何排序的。

如果您确实知道它已被排序(因为对象只在您调用lower_bound的同一个线程中不存在),那么您需要确保

  1. 向量的排序方式是所有空的weak_ptr都小于所有非空的。
  2. 所有空的weak_ptr都不小于彼此。
  3. 相同的比较器用于向量的排序和lower_bound函数。
  4. 如果您无法保证在调用lower_bound之前和之后元素的顺序保持不变(在上面的比较器下),则不能使用lower_bound。

    换句话说,你可以绕过这样一个事实,即lock会通过检查并在比较器中正确处理它来返回一个空指针,但是如果你的对象是你的对象你不应该这样做消失在另一个线程中(因为那时你的订单不是确定性的)。