【问题标题】:std::shared_ptr::owner_before and std::owner_less: What exactly is meant by "owner-based order"?std::shared_ptr::owner_before 和 std::owner_less:“基于所有者的订单”到底是什么意思?
【发布时间】:2014-02-18 00:44:26
【问题描述】:

我发现了一些关于此的讨论,但似乎没有任何内容具体说明“基于所有者的订单”实际上是什么。

它是否有效地根据拥有的指针内存地址的值评估<

【问题讨论】:

    标签: c++ c++11


    【解决方案1】:

    它定义了一个任意严格的弱排序,在该排序下,两个指针当且仅当它们共享所有权或都为空时才是等价的。

    等价是按通常的方式定义的:

    bool equivalent(p1, p2) {
        return !p1.owner_before(p2) && !p2.owner_before(p1);
    }
    

    这并不一定意味着它们指向同一个对象。两个指针可以指向不同的对象但仍然共享所有权:

    struct thing {int n;};
    shared_ptr<thing> t1 = make_shared<thing>();
    shared_ptr<int>   t2(t1, &t1->n);
    
    assert(t1 != t2);          // point to different objects
    assert(equivalent(t1,t2)); // share ownership
    

    同样,两个指针可以指向同一个对象而不共享:

    thing t;
    shared_ptr<thing> t1(&t, some_deleter());
    shared_ptr<thing> t2(&t, some_deleter());
    
    assert(t1 == t2);            // point to the same object
    assert(!equivalent(t1, t2)); // don't share ownership
    

    (当然,这对于默认删除器来说将是灾难性的,因为两者都会尝试删除对象;但是对于这种事情有合适的自定义删除器的合理应用)。

    实际上,这可以通过比较用于共享引用计数的内部结构的地址来实现。

    【讨论】:

      【解决方案2】:

      从语义上讲,这意味着两个shared_ptrs 比较相等,前提是它们共享所有权或都是nullptr,否则shared_ptrs 的顺序是一致的。

      实际上,这种排序是通过将内部指针与在“共享所有权”的shared_ptrs 之间共享的引用控制块进行比较来实现的。请注意,可以通过构造函数创建具有不同 get()shared_ptrs 共享所有权:

      template< class Y >
      shared_ptr( const shared_ptr<Y>& r, T *ptr );
      

      这很有用,例如,用于分发指向 shared_ptr 持有的对象成员的指针。

      【讨论】:

      • +1 关于shared_ptr( const shared_ptr&lt;Y&gt;&amp; r, T *ptr ); 的优点。
      • 是的,我已经明白了它是如何与shared_ptr 的别名构造函数一起工作的,但是仅仅说存在一些一致的顺序听起来仍然过于模糊。例如。我期望这个顺序不会改变什么样的时间表......?它没有回答我是否应该将其视为比较指针值本身的问题?
      • @StevenLu:排序是未指定的,但在共享对象的生命周期内不会改变——一旦你确定一个指针在另一个之前,那么它就不会改变。这与比较指针值不同。
      猜你喜欢
      • 2020-09-01
      • 2021-12-28
      • 1970-01-01
      • 2017-05-13
      • 2012-04-04
      • 2013-03-20
      • 2017-08-13
      • 1970-01-01
      相关资源
      最近更新 更多