我有几个关于智能指针的问题,之前我没有给他们任何信任。
- 在智能指针的世界里拥有一个对象、指向一个对象和管理一个对象是什么意思?早些时候我认为拥有该对象的人也指向它并管理该对象。现在,我知道智能指针可以拥有一个对象,但指向另一个对象(别名构造函数)。在这里,我找到了一个关于拥有对象意味着什么的非常好的解释 -> http://www.umich.edu/~eecs381/handouts/C++11_smart_ptrs.pdf , 但我仍然无法区分这 3 个术语。
- 如果指针拥有一个对象,但指向另一个对象,他管理的是哪个对象?他拥有的那个,或者他指向的那个,或者两者兼而有之?拥有一个对象但不指向它有什么意义?
- 两个智能指针什么时候相等?两个指针可以拥有同一个对象并且同时不同吗?我对他们的值(value)平等不感兴趣,但对所有权感兴趣。
- 为什么所有权顺序很重要(除了使用指针作为容器中的键)?我想这只与 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>,但是因为我们的 bar
是 foo
的一部分,所以我们不能在不销毁 bar
的情况下销毁 foo
,所以我们使用别名构造函数。
但实际上,我们并没有这样做,因为这种用例非常罕见。
关于c++ - 智能指针所有权语义和平等,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41143311/