c++ - 智能指针所有权语义和平等

标签 c++ smart-pointers ownership-semantics

我有几个关于智能指针的问题,之前我没有给他们任何信任。

  1. 在智能指针的世界里拥有一个对象、指向一个对象和管理一个对象是什么意思?早些时候我认为拥有该对象的人也指向它并管理该对象。现在,我知道智能指针可以拥有一个对象,但指向另一个对象(别名构造函数)。在这里,我找到了一个关于拥有对象意味着什么的非常好的解释 -> http://www.umich.edu/~eecs381/handouts/C++11_smart_ptrs.pdf , 但我仍然无法区分这 3 个术语。
  2. 如果指针拥有一个对象,但指向另一个对象,他管理的是哪个对象?他拥有的那个,或者他指向的那个,或者两者兼而有之?拥有一个对象但不指向它有什么意义?
  3. 两个智能指针什么时候相等?两个指针可以拥有同一个对象并且同时不同吗?我对他们的值(value)平等不感兴趣,但对所有权感兴趣。
  4. 为什么所有权顺序很重要(除了使用指针作为容器中的键)?我想这只与 shared_ptr 相关。

一切都是从试图理解 owner_before 开始的,现在我比开始探索这个话题之前更困惑了.. :(

最佳答案

我认为您所有的困惑都来自“别名构造函数”:

template <typename U>
shared_ptr(const shared_ptr<U>& x, element_type* p)

这东西有什么用?好吧,它很少被使用,但它所做的是“共享”某个对象 x 的所有权,但是当您取消引用它时,您将获得 p 。就这样。它永远不会删除 p 或对它做任何其他事情。

如果你有这样的东西,它可能会有用:

struct Foo {
    Bar bar;
};

struct Baz {
    Baz(shared_ptr<Bar> bar) : m_bar(bar) {}
    shared_ptr<Bar> m_bar;
};

int main()
{
    auto foo = make_shared<Foo>();
    Baz baz(shared_ptr<Bar>(foo, &foo.bar));
}

现在 baz 开始管理 foo 的生命周期而不知道它正在做什么——它只关心它管理 Bar 的生命周期code>,但是因为我们的 barfoo 的一部分,所以我们不能在不销毁 bar 的情况下销毁 foo,所以我们使用别名构造函数。

但实际上,我们并没有这样做,因为这种用例非常罕见。

关于c++ - 智能指针所有权语义和平等,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41143311/

相关文章:

c++ - 为什么 isdigit() 不起作用?

c++ - 在使用 CreateInstance 重新分配之前需要释放 com_ptr_t 吗?

c++ - 你可以将 pimpl-Class 放入 vector 中吗

rust - Rust 中线程之间共享数组

c++ - Qt QGraphicsSvgItem 缩放和调整大小

c++ - 使用 lodePng 和 OpenGL 显示 png 图像

c++ - 在 OpenGL 2.1 中,即使在 2d 空间(具有 2D 纹理)中使用 3D tex 坐标是否安全?

c++ - unique_ptr 和 OpenSSL 的 STACK_OF(X509)*

c++ - 是否有适合 'ownership-in-a-package' 的 'handles' 可用?

c++ - 如何使用 Boost 库智能指针管理对象生命周期?