Я использую 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
это вызывает segfault. Я думаю, это из-за lock()
, который возвращается пустым shared_ptr
,
Как я могу это исправить?
Вы не можете сортировать элементы, значения которых не являются детерминированными (а значения, хранящиеся в weak_ptr, не являются детерминированными). Таким образом, у вас нет возможности узнать, что вектор отсортирован.
Если вы знаете, что он отсортирован (поскольку объекты перестают существовать только в том же потоке, в котором вы вызываете lower_bound), вам необходимо убедиться, что
Если вы не можете гарантировать, что порядок элементов остается неизменным (в приведенном выше компараторе) до и после вашего вызова lower_bound, тогда вы не можете использовать lower_bound.
Другими словами, вы Можно обойти тот факт, что lock вернет пустой указатель, проверив его и обработав соответствующим образом в компараторе, но вы не должны этого делать, если ваши объекты исчезают в другом потоке (потому что тогда ваш порядок не является детерминированным).