Вектор слабого_птр, блокировка (). Нижняя граница. 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 это вызывает segfault. Я думаю, это из-за lock(), который возвращается пустым shared_ptr,

Как я могу это исправить?

0

Решение

Вы не можете сортировать элементы, значения которых не являются детерминированными (а значения, хранящиеся в weak_ptr, не являются детерминированными). Таким образом, у вас нет возможности узнать, что вектор отсортирован.

Если вы знаете, что он отсортирован (поскольку объекты перестают существовать только в том же потоке, в котором вы вызываете lower_bound), вам необходимо убедиться, что

  1. вектор сортируется таким образом, что все пустые слабые_птры меньше, чем все непустые.
  2. что все пустые слабые_птры не меньше друг друга.
  3. один и тот же компаратор используется как для сортировки вектора, так и для функции lower_bound.

Если вы не можете гарантировать, что порядок элементов остается неизменным (в приведенном выше компараторе) до и после вашего вызова lower_bound, тогда вы не можете использовать lower_bound.

Другими словами, вы Можно обойти тот факт, что lock вернет пустой указатель, проверив его и обработав соответствующим образом в компараторе, но вы не должны этого делать, если ваши объекты исчезают в другом потоке (потому что тогда ваш порядок не является детерминированным).

1

Другие решения


По вопросам рекламы [email protected]