我已经就此发现了一些讨论,但似乎没有任何内容可以指明"基于所有者的订单"实际上是什么.
它是否有效地评估<自有指针内存地址的值?
Mik*_*our 10
它定义了一个任意严格的弱排序,当两个指针相同时,它们共享所有权或者都是空的.
等效性以通常的方式定义:
bool equivalent(p1, p2) {
return !p1.owner_before(p2) && !p2.owner_before(p1);
}
Run Code Online (Sandbox Code Playgroud)
这并不一定意味着它们指向同一个对象.两个指针可以指向不同的对象,但仍然共享所有权:
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
Run Code Online (Sandbox Code Playgroud)
同样,两个指针可以指向同一个对象而不共享:
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
Run Code Online (Sandbox Code Playgroud)
(当然,这对于默认删除器来说是灾难性的,因为两者都会尝试删除对象;但是对于这种具有合适自定义删除器的东西,有合理的应用程序).
实际上,这可以通过比较用于共享引用计数的内部结构的地址来实现.
从语义上讲,这意味着shared_ptr只有当两个 s 共享所有权或都是 时nullptr,两个 s 才比较相等,否则 s 的顺序一致shared_ptr。
实际上,这种排序是通过将内部指针与shared_ptr“共享所有权”之间共享的引用控制块进行比较来实现的。请注意,可以通过构造函数创建具有不同共享所有权的shared_ptrs :get()
template< class Y >
shared_ptr( const shared_ptr<Y>& r, T *ptr );
Run Code Online (Sandbox Code Playgroud)
这很有用,例如,用于分发指向 所持有的对象的成员的指针shared_ptr。
| 归档时间: |
|
| 查看次数: |
1525 次 |
| 最近记录: |