gpt4 book ai didi

c++ - weak_ptr 的 vector ,lock()。下限。段错误

转载 作者:行者123 更新时间:2023-11-28 06:20:05 25 4
gpt4 key购买 nike

我正在使用 lower_bound() 在 weak_ptr 的排序 vector 中搜索

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有私有(private)string ID和一个公共(public)方法 getID .当findA电话 getID它会导致段错误。我猜是因为 lock() ,返回空 shared_ptr .

我该如何解决?

最佳答案

您不能对值不确定的元素进行排序(存储在 weak_ptr 中的值也不是确定的)。所以你无法知道 vector 已经排序。

如果您确实知道它已排序(因为对象仅在您调用 lower_bound 的同一线程中不存在),那么您需要确保

  1. vector 以所有空 weak_ptr 小于所有非空 weak_ptr 的方式排序。
  2. 所有空的 weak_ptr 都不少于彼此。
  3. 相同的比较器用于 vector 的排序和 lower_bound 函数。

如果您不能保证在调用 lower_bound 之前和之后元素的顺序保持不变(在上述比较器下),那么您就不能使用 lower_bound。

换句话说,您可以通过检查它并在比较器中适本地处理它来绕过锁将返回一个空指针的事实,但是如果您的对象是消失在不同的线程中(因为那样你的订单是不确定的)。

关于c++ - weak_ptr 的 vector ,lock()。下限。段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29462007/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com