簡體   English   中英

向量weak_ptr,lock()。 下界。 段錯誤

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

其中sashared_ptr<A> ,類A具有專用string ID和公用方法getID findA調用getID它將導致段錯誤。 我猜是因為lock()會重新運行空的shared_ptr

我該如何解決?

您不能對值不確定的元素進行排序(並且存儲在weak_ptr中的值不是確定的)。 因此,您無法知道向量已排序。

如果您確實知道它已排序(因為對象僅在調用lower_bound的同一線程中不存在),則需要確保

  1. 向量的排序方式是使所有空的weak_ptr小於所有非空的。
  2. 所有空的weak_ptr不小於彼此。
  3. 向量的排序和lower_bound函數都使用相同的比較器。

如果不能保證在調用lower_bound之前和之后元素的順序保持不變(在上面的比較器下),則不能使用lower_bound。

換句話說,您可以通過檢查鎖並在比較器中對其進行適當處理來避免鎖將返回空指針的事實,但是如果您的對象在另一個線程中消失,則不應該這樣做(因為這樣您的順序就可以了)是不確定的)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM