[英]Vector of weak_ptr, lock(). Lower bound. Segfault
我正在使用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
。
我該如何解決?
您不能對值不確定的元素進行排序(並且存儲在weak_ptr中的值不是確定的)。 因此,您無法知道向量已排序。
如果您確實知道它已排序(因為對象僅在調用lower_bound的同一線程中不存在),則需要確保
如果不能保證在調用lower_bound之前和之后元素的順序保持不變(在上面的比較器下),則不能使用lower_bound。
換句話說,您可以通過檢查鎖並在比較器中對其進行適當處理來避免鎖將返回空指針的事實,但是如果您的對象在另一個線程中消失,則不應該這樣做(因為這樣您的順序就可以了)是不確定的)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.