我使用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());
} );
}
sa
是shared_ptr<A>
,A
类有私有string ID
和公共方法getID
。
findA
调用getID
时会导致段错误。我想这是因为lock()
,它会重新空shared_ptr
。
我该如何解决?
答案 0 :(得分:1)
您不能对值不确定的元素进行排序(存储在weak_ptr中的值不是确定性的)。所以你无法知道向量是如何排序的。
如果您确实知道它已被排序(因为对象只在您调用lower_bound的同一个线程中不存在),那么您需要确保
如果您无法保证在调用lower_bound之前和之后元素的顺序保持不变(在上面的比较器下),则不能使用lower_bound。
换句话说,你可以绕过这样一个事实,即lock会通过检查并在比较器中正确处理它来返回一个空指针,但是如果你的对象是你的对象你不应该这样做消失在另一个线程中(因为那时你的订单不是确定性的)。