"owned pointer"和 std::shared_ptr 的"stored pointer"有什么区别?

What is difference between "owned pointer" and the "stored pointer" for std::shared_ptr?

本文关键字:pointer stored 什么 区别 owned std shared ptr      更新时间:2023-10-16

根据这个文档,它说(强调我的(:

http://www.cplusplus.com/reference/memory/shared_ptr/owner_before/

与运算符<重载不同,此排序考虑了>shared_ptr拥有的指针,而不是存储的指针,如果它们都共享所有权,或者它们都是空的,即使它们存储的指针值不同,则其中两个对象被视为等效的(即,无论操作数的顺序如何,此函数都返回 false(。

如果存储的指针是别名(别名构造的对象及其副本(,shared_ptr则存储的指针(即shared_ptr对象取消引用的指针(可能不是拥有的指针(即,在对象销毁时删除的指针(。

std::shared_ptr的"拥有指针"和"存储指针"有什么区别?

如果能在这个问题上得到一些帮助,我将不胜感激。

以下是一些相关代码(检查 http://cpp.sh/27auqq(:

// enable_shared_from_this example
#include <iostream>
#include <memory>
struct C : std::enable_shared_from_this<C> {int a; int b; };
int main () {
std::shared_ptr<C> foo, bar;
foo = std::make_shared<C>();
bar = foo->shared_from_this();

std::shared_ptr<int> p1(foo, &foo->a);
std::shared_ptr<int> p2(foo, &foo->b);

*p1=5;
*p2=9;

std::cout << p1.use_count() << std::endl;
std::cout << foo->a << std::endl;
std::cout << foo->b << std::endl;
if (!foo.owner_before(bar) && !bar.owner_before(foo))
std::cout << "foo and bar share ownership" << std::endl;

if(!p1.owner_before(p2) && !p2.owner_before(p1))
std::cout << "p1 and p2 share ownership" << std::endl;

if(!p1.owner_before(foo) && !foo.owner_before(p1))
std::cout << "p1 and foo share ownership" << std::endl;

return 0;
}

这是输出:

4
5
9
foo and bar share ownership
p1 and p2 share ownership
p1 and foo share ownership

std::shared_ptr的"拥有的指针"和"存储的指针"有什么区别?

每当使用构造函数template< class Y > shared_ptr::shared_ptr( const shared_ptr<Y>& r, element_type* ptr ) noexcept;时,你都有与r共享所有权的东西,但取消对*ptr的引用。

例如之后

std::shared_ptr<std::pair<int, double>> pair = std::make_shared<std::pair<int,double>>(1, 2.);
std::shared_ptr<int> i(pair, &pair->first);
pair.reset();

std::pair<int, double>i保持活力

为了支持诸如将shared_ptr<Derived>转换为shared_ptr<Base>之类的事情,即使不存在虚拟析构函数(在这种情况下,即使对于动态分配的类来说通常不是一个好主意(,以及对于其他一些功能,shared_ptr需要一个指向该实例中每个特定实例指定的对象的指针, 另一个在控制块中。控制块用于:

  • 用于计算"强引用"(由shared_ptr管理的动态分配的已用资源的所有者(和"弱引用"(控制块的所有者,但不是托管已用资源的所有者(;
  • 记住要删除的内容(指向拥有对象的指针(以及如何删除它。控制块保存传递给原始shared_ptr构造函数的确切指针值

通常,该值仅用于删除目的。仅当您使用owner_before时,才会检查(比较(其值。所有其他函数检查每个shared_ptr实例中的指针,而不是控制块中的指针。